繁体   English   中英

将结构添加到c中的双向链表中

[英]adding structs into doubly linked list in c

我是编程新手(第一学期),我在这里找到的示例在做作业时总是对我有很大帮助! 现在我必须做一个稍微大一点的项目,我已经阅读了很多,但我无法解决问题。

我需要做什么

  1. 从文件中的文本中读取数据
  2. 通过strtok()将其排序为结构体(通过将从文件读取的数据分配给结构体字段,将其放入结构体中)
  3. 将结构添加到双向链表中

问题

  1. 当我打印列表时,列表中只有第一个和最后一个结构,中间的结构消失(第一个条目“head”与pNode=head;一起在 main 中定义)
  2. 如果我尝试按前向顺序打印列表,它会无限地打印最后一个列表元素。

我试图只复制我认为对问题重要的部分。 由于我已经尝试了很多,我什至不知道在哪里寻找错误,任何帮助或提示表示赞赏。 提前谢谢了!

void read_file(struct node *pNode, FILE *fp) {
    struct node *head = pNode;
    head->next=NULL;
    head->prev=NULL;

    /*(fread, strtok_r, strtok,...)*/

    while (token1 != NULL) {
        //allocating memory for the structs
        struct node*new = calloc(1, sizeof(struct node));
        *new =*pNode;

        while (token2 != NULL) {
            new->index = (*token2 - 48);
            token2 = strtok(NULL, "\n"); //jump to next token (=next line)

            new->name = malloc(sizeof(char)*strlen(new->name)+1);
            strcpy(new->name, token2);
            token2 = strtok(NULL, "\n");

            /*(some more sorting into struct)*/

            /*ADD STRUCT TO LIST*/

            if (head->next==NULL){
                head->next=new;
                head->prev=NULL;
                new->prev=head;
                new->next=NULL;
            }

            new->next = head->next;
            head->next = new;
            new->next->prev = new;
            new->prev = head;
            head->prev = NULL;

            pNode=new;
        }

        token_recipe = strtok_r(NULL, "#", &temp); //jump to next token (=next recipe)
    }

    printf("\nLinked list in backwards order:\n");

    while (pNode != NULL) {
        printf("%s ", pNode->name);
        pNode= pNode->prev;
    }
    puts("\n");
}

你有一个混乱的纠缠在这里,我会试着帮助解开。

        if (head->next==NULL){
            head->next=new;
            head->prev=NULL;
            new->prev=head;
            new->next=NULL;
        }

        new->next = head->next;
        head->next = new;
        new->next->prev = new;
        new->prev = head;
        head->prev = NULL;

第一次在你身边有head new head->nextNULL因此您在if块中执行该位并最终得到如下所示的列表:

头 <-> 新

然后你指向new->next to head->next ...这意味着你指向new->next to new

头 <-> 新 -> 新

new->next->prev = new所以new->prev现在也等于new

头 -> 新 <-> 新

但是随后您修复它以将其指向head并将head->prev设置为NULL ,它可能已经是NULL ,因为您永远不会更改它。

头 <-> 新 -> 新

而且你仍然有new指向自己作为下一个节点的循环循环。

完全废弃该代码。 pNode是列表中的前一个节点,最初与head相同 - 这是您应该链接到的变量。

new->prev = pNode;
pNode->next = new;

未指定的上一个和下一个值应该已经设置为NULL (因为您正在使用calloc )或指向内存中的有效位置,因此您不需要弄乱它们。

然后在循环结束时正确执行以下操作

pNode = new;

将列表的末尾指向创建的最新节点。

您还应该删除以下行,因为new是一个全新的节点 - pNode不应有任何要复制的内容,因此您正在设置您不想要的下一个和上一个值'已经正确设置为NULL

*new =*pNode;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM