以下代码用于创建单一链接列表,并使用两个函数 create_ll()和 display()显示它。
#include<stdio.h>
#include<stdlib.h>
struct Node
{
int data;
struct Node* next;
};
struct Node* create_ll(struct Node*);
struct Node* display(struct Node*);
int main(int argc, char *argv[])
{
struct Node* start=NULL;
int option=0;
do
{
printf("\t\t\t*******MAIN MENU********");
printf("\n\t1.Create a list");
printf("\n\t2.Display the list");
printf("\n\t3.Exit");
scanf("%d",&option);
switch(option)
{
case 1: start=create_ll(start);
printf("\nLinked list created");
break;
case 2: start=display(start);
break;
};
}while(option!=3);
return 0;
}
struct Node* create_ll(struct Node* start)
{
struct Node *new_node,*ptr;
int num;
printf("Enter -1 to end");
printf("\nEnter data");
scanf("%d",&num);
while(num!=-1)
{
printf("Creating Node....");
new_node=(struct Node*)malloc(sizeof(struct Node));
if(new_node!=NULL)
{
new_node->data=num;
if (start==NULL)
{
new_node->next=NULL;
start=new_node;
}
else
{
ptr=start;
while(ptr->next!=NULL)
ptr=ptr->next;
ptr->next=new_node;
new_node->next=NULL;
}
}
else
{
printf("\nOut of Memory!");
}
printf("\nEnter data");
scanf("%d",&num);
}
return start;
}
struct Node* display(struct Node* start)
{
struct Node *ptr;
ptr=start;
while(ptr->next!=NULL)
{
printf("%d\t",ptr->data);
ptr=ptr->next;
}
return start;
}
它在Ubuntu上的gcc编译器上成功编译,没有任何错误。但是,运行后会出现分段错误(核心转储)错误。
gdb显示故障在第59行: -
$ gdb -q LS.out
Reading symbols from LS.out...done.
(gdb) run
Starting program: /home/arpit/Desktop/Ds/LS.out
*******MAIN MENU********
1.Create a list
2.Display the list1
Enter -1 to end
Enter data 4
Program received signal SIGSEGV, Segmentation fault.
0x00000000004007de in create_ll (start=0x0) at LS.c:59
59 while(ptr->next!=NULL)
答案 0 :(得分:2)
在display()
中,您假设ptr不为空
struct Node* display(struct Node* start)
{
struct Node *ptr;
ptr=start;
while(ptr->next!=NULL)
如果start为NULL,那么NULL->next
将导致问题。
您看到的错误是因为您在create_ll()
函数中执行了同样的操作。
答案 1 :(得分:1)
我认为你有一个错字。将if (start=NULL)
更改为if (start == NULL)
。在C中,=
是赋值运算符,==
用于比较。
执行if (start=NULL)
时,变量start
被分配给NULL
并且if
块未执行,因为赋值表达式返回右侧的任何内容。之后,您的ptr
变为NULL
,然后在ptr
块(else
)中取消引用while(ptr->next!=NULL)
,这会导致分段错误。