将用户生成的节点添加到C中链接列表的末尾

时间:2018-05-05 23:27:41

标签: c memory-management linked-list allocation

我认为我搞砸了一些我没有看到的简单的东西,但应该发生的是选择添加新节点的菜单选项。主程序创建一个新节点,将其传递给一个函数,该函数将它添加到链表的末尾。下面是代码片段,应该有助于解释我的所作所为。

节点声明:

typedef struct Node {
    char fname[51];
    char lname[51];
    int idnum;
    float scores[5];
    float average;

    struct Node *next;
} Node;

新节点创建和用户指定值:

 case 'A':
     entry = (Node*)malloc(sizeof(Node));
     printf("Enter the name of the record you would like to append\nFirst:");
     scanf("%50s", &(*entry).fname);
     printf("\nLast:\n");
     scanf(" %50s", &(*entry).lname);
     printf("Enter the ID of the record you would like to append\n");
     scanf("%d", &(*entry).idnum);
     printf("Enter the scores of the record you would like to append\n");
     for(j=0;j<5;j++) {
         scanf("%f", &(*entry).scores[j]);
     }
     head = addend(head,entry);
     printrecords(head,disp);
break;

将节点添加到链接列表的末尾:

Node* addend(Node* head, Node* entry) {
    if(head == NULL) {
            return NULL;
    }

    Node *cursor = head;
    while(cursor->next != NULL) {
            cursor = cursor->next;
    }
    cursor->next = entry;

    return head;

}

非常感谢任何帮助。

解决:

当我通过我想要分配给它的节点时,不确定为什么我要创建一个新节点。更新代码以反映这一点。同样正如@jose_Fonte指出的那样,这个代码在正式设置中使用是有风险的,因为对头部的引用可能会丢失。

1 个答案:

答案 0 :(得分:0)

您不应该将项目添加到单个链接列表的末尾。它破坏了O(1)此结构所基于的添加/删除操作的复杂性的整体思路。它意味着从正面或在保持节点指针的项目之后增长。因此,我将add_after方法写入两个参数:在插入新节点后指向节点的指针和指向新节点的指针。您可以保留指向新节点的指针并按顺序使用它,从背面增加链接列表。