【发布时间】:2018-05-29 13:16:26
【问题描述】:
这是我用 ANSI C 编写的代码。 我不断收到运行时错误:分段错误(SIGSEGV)。 请帮帮我。 我是数据结构和 C 的新手。 我无法检测到问题。
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *nxt;
}node;
node * create(int n);
void display(node *head);
int main()
{
int n = 0;
node *head = NULL;
printf("Enter the number of nodes\n");
scanf("%d", &n);
head = create(n);
display(head);
return 0;
}
node * create(int n)
{
int i;
node *head = NULL;
node *temp = NULL;
node *p = NULL;
for (i = 0; i < n; i++)
{
temp = (node *)malloc(sizeof(node));
printf("\nEnter the value of %d node", i + 1);
scanf("%d", &temp->data);
temp->nxt = NULL;
if (head == NULL)
{
head = temp;
}
else
{
p = head;
while (p->nxt != NULL)
{
p = p->nxt;
p->nxt = temp;
}
}
}
return head;
}
void display(node *head)
{
node *p = NULL;
if (head = NULL)
{
printf("\nEmpty List");
}
else
{
p = head;
while (p != NULL);
{
printf("%d->", p->data);
p = p->nxt;
}
}
}
【问题讨论】:
-
欢迎来到 SO。您的代码很难阅读。请编辑您的问题以应用适当的缩进。除此之外,此时您应该开始考虑使用像 GDB 这样的调试器。它应该向您显示 SIGSEGV 发生的位置,这是搜索错误的良好起点。
-
您的错误出现在循环
while(p->nxt!=NULL)中,您在其中重复分配temp。使用调试器并单步执行代码。 -
在显示代码中,在 while 循环之后有一个不需要的分号:
while (p != NULL);— 如果p为空,则几乎可以保证在它之后的printf()调用中崩溃,或者如果它不为空,则无限循环。两者都不可取。此外,在此之前,您可以使用if (head = NULL)中的分配来删除您的head指针。大多数现代编译器都会对此发出警告。如果您的编译器没有,请找到相应的选项,或者使用更好、更现代的编译器。
标签: c data-structures linked-list