用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
为第一个分配的p
。p->next
中的p
=NULL
解引用为未定义行为。所以任何事情都有可能发生。
现在修复您需要保持对列表中最后一个元素的引用,以便将其next
设置为新创建的节点p
。让我们命名为end
。
在初始步骤中,只形成一个微圆列表(p->next = p
),并让start
和end
指向它。
在每次迭代中,将新分配的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;
}
}