C链表分段故障(核心转储)错误

时间:2018-04-02 05:38:30

标签: c data-structures linked-list segmentation-fault

我是数据结构的新手,在实现双链表时遇到了一些麻烦。在采取所有输入编译器显示分段故障(核心转储)之后。找不到错误。 我搜索了核心转储错误以及分段错误,但它没有帮助。 这是我的代码:

struct node
{
    int data;
    struct node *lptr,*rptr;
};

struct node *head;

void create(struct node *head)
{
    struct node *newp,*ptr;
    int num,n;

    printf("Enter the no. of elements you want to enter :\n");
    scanf("%d",&n);

    printf("Enter the elements:\n");

    while(n)
    {
        scanf("%d",&num);
        n--;

        if(head==NULL)
        {
            newp=(struct node *)malloc(sizeof(struct node));
            newp->lptr=NULL;
            newp->data=num;
            newp->rptr=NULL;
            head=newp;
            printf("Head created\n");
            ptr=head;

        }

        else
        {
            while(ptr->rptr)
            {
                ptr=ptr->rptr;
            }

            ptr->rptr=(struct node *)malloc(sizeof(struct node));
            ptr->rptr->lptr=ptr;
            ptr->data=num;
            ptr->rptr->rptr=NULL;
            ptr=ptr->rptr;
            printf("node inserted\n");
        }
    }
}   

void display(struct node *head)
{
    struct node *ptr;
    ptr=head;
    while(ptr->rptr)
    {
        printf("%d\t",ptr->data );
        ptr=ptr->rptr;
    }
}

void main()
{   
    head=NULL;

    create(head);
    display(head);
}   

3 个答案:

答案 0 :(得分:-2)

head函数在本地修改display()变量,因此当您调用head时,它不会指向新创建的列表。

修改create函数以返回新的头指针。这是样本变化。您需要解决的一些问题,例如,您不需要将head参数传递给它,或者只有在创建新列表时才需要返回struct node *create(struct node *head) { .... return head; } void main() { head=NULL; head = create(head); display(head); }

from docx.api import Document    
from docx.enum.text import WD_BREAK

inputfile = 'test.docx'
document = Document(inputfile)
for paragraph in document.paragraphs:
    # Write paragraph text into new document
    # Write additional text as PARAEND_<<ParaNumber>>

答案 1 :(得分:-2)

在Main函数中,您将NULL值分配给全局变量头。 然后你传递NULL值来创建函数。 您只在create function中为内部变量头分配内存。

然后你将相同的空值传递给显示功能,在显示内部你试图访问NULL地址导致分段错误..

作为修复,你已经在主函数中分配内存并发送头(&amp; head)的传递地址来创建和显示函数

`struct node *create(struct node **head)
 {
      ....

      return head;
  }

void main()
{   
    head=malloc(...);
    head = create(&head);
    display(&head);
}`

答案 2 :(得分:-2)

void create(struct node *head){}

当您在head内更新create()时,实际更新了已通过的副本。您需要struct node **head,然后更新*head。 同时,您可以避免将head传递给create(),因为它是全局的。

然后

ptr->rptr->lptr=ptr;
ptr->data=num;

应该是,否则你最终会更新上一个节点。

 ptr->rptr->lptr=ptr;
 ptr->rptr->data=num;

display()应该是,否则你不会打印最后一个节点。

while(ptr)
{
    printf("%d\t",ptr->data );
    ptr=ptr->rptr;
}