C语言 试图制作一个反向循环单链表,其中每个节点都添加在列表的前面,但所有后续节点都丢失



用C编写了一个反向循环单链表程序,其中每个节点都应添加到列表的前面,但由于某种原因,所有后续节点在此过程中都丢失了。无法弄清楚这是逻辑缺陷还是代码编写中的一些错误/打字错误。下面是代码:

#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node *next;
};
int main()
{
struct node *start, *p;
int n;
printf("Enter length of list: ");
scanf(" %i", &n);
start = NULL;
for (int i = 0; i < n; i++)
{
p = malloc(sizeof(struct node));
printf("Enter data: ");
scanf(" %i", &p->data);
if (start == NULL)
{
p->next = start;
start = p;
}
else
{
p->next = start->next;
start = p;
}
}
p = start;
printf("List entered is: ");
for (p = start; p->next != start; p = p->next)
{
printf("%it", p->data);
}
printf("%i", p->data);
return 0;
}

问题是p->next = NULL为第一个分配的pp->next中的p=NULL解引用为未定义行为。所以任何事情都有可能发生。

现在修复您需要保持对列表中最后一个元素的引用,以便将其next设置为新创建的节点p。让我们命名为end

在初始步骤中,只形成一个微圆列表(p->next = p),并让startend指向它。

在每次迭代中,将新分配的p作为一个新的开始,将end->next更新为指向p

内部分配循环可以重写为:

for (int i = 0; i < n; i++) {
p = malloc(sizeof(struct node));
printf("Enter data: ");
scanf(" %i", &p->data);
if (start) {
p->next = start;
end->next = p;
start = p;
} else {
p->next = p;
start = end = p;
}
}

最新更新