我想我搞砸了一些我没有看到的简单事情,但是应该发生的是选择了用于添加新节点的菜单选项。主程序创建一个新节点,将其传递给一个函数,该函数将其添加到链表的末尾。下面是代码片段,应该有助于解释我做了什么。
节点声明:
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 appendnFirst:");
scanf("%50s", &(*entry).fname);
printf("nLast:n");
scanf(" %50s", &(*entry).lname);
printf("Enter the ID of the record you would like to appendn");
scanf("%d", &(*entry).idnum);
printf("Enter the scores of the record you would like to appendn");
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指出的那样,在正式设置中使用此代码是有风险的,因为对 head 的引用可能会丢失。
你不应该将一个项目添加到单个链表的末尾。它破坏了此结构所基于的添加/删除操作的 O(1( 复杂性的整个想法。它意味着从前端或您保留节点指针的项目之后增长。因此,我会编写add_after
方法,其中包含两个参数:在插入新节点后指向节点的指针和指向新节点的指针。您可以保留指向新节点的指针并按顺序使用它,以从其背面增长链表。