为什么我不能在 C 中遍历这个链表?



我很难理解为什么我在尝试遍历我练习的链表时会出现无限循环:

#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;
}
}

相关内容

  • 没有找到相关文章

最新更新