创建链接列表会产生分段错误(核心转储)错误

时间:2017-08-08 14:28:12

标签: c data-structures linked-list

以下代码用于创建单一链接列表,并使用两个函数 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)

2 个答案:

答案 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),这会导致分段错误。