我很难理解为什么我在尝试遍历我练习的链表时会出现无限循环:
#include <stdio.h>
#include <stdlib.h>
typedef struct noeud {
int val;
struct noeud *next;
} noeud;
noeud* add_first(noeud* head, int val){
noeud* p = malloc(sizeof(noeud));
if(p == NULL){
puts("ERROR ALLOCATING NODE ");
exit(-1);
}
else{
p->val = val;
p->next = head;
}
return p;
}
void discover(noeud* head){
noeud* current = head;
while(current != NULL){
printf("---|%d|-|%p|---",current->val, current->next);
current = head->next;
}
}
int main(){
noeud* head = malloc(sizeof(noeud));
head->next = NULL;
head = add_first(head, 5);
head = add_first(head, 4);
head = add_first(head, 3);
head = add_first(head, 8);
discover(head);
return 0;
}
这是我所做的:我创建了一个像 push 这样的函数来添加节点,每个节点都会链接到前一个节点,每次推送新内容时,我都会更新头部以获取第一个节点。
然后我只是想打印下一个节点的结果和地址,为此,我使用了 while 循环,我会验证 NULL 条件,我相信问题是在更新 head 后,head->next
不再是 NULL,但我真的找不到一种方法将最后一个元素点保持为 null。
在函数的开头,您将 head 指针复制到堆栈变量noeud* current = head;
,但随后在 while 循环中将堆栈变量分配给 head 的下一个成员current = head->next;
。
这只会导致连续分配到同一个next
地址,并且永远不会移动current
只需将其切换到:
current = current->next;
你如何为"头节点"分配内存看起来很奇怪,你不需要这样做。您所需要的只是一个像这样noeud* head = NULL;
的 HEAD 指针。
您的main()
变为:
int main(){
noeud* head = NULL;
head = add_first(head, 5);
head = add_first(head, 4);
head = add_first(head, 3);
head = add_first(head, 8);
discover(head);
return 0;
}
然后,您必须根据Josh Weinstein的答案修改打印功能:
void discover(noeud* head){
noeud* current = head;
while(current != NULL){
printf("---|%d|-|%p|---n",current->val, current->next);
current = current->next;
}
}