【问题标题】:C linked list segmentation fault (core dumped) error [closed]C链表分段错误(核心转储)错误[关闭]
【发布时间】:2018-04-02 05:38:30
【问题描述】:

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

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);
}   

【问题讨论】:

  • 请注意,您有多个名为head不同变量。它们没有任何联系。

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


【解决方案1】:

create()函数在本地修改head变量,所以当你调用display()时,它并不指向新创建的列表。

修改 create 函数以返回新的头指针。这是示例更改。有些事情你需要解决,比如你不需要将head 参数传递给它,或者只在创建新列表时才需要返回head 等。

struct node *create(struct node *head)
{

....

   return head;
}

void main()
{   
    head=NULL;

   head = create(head);
    display(head);
}  

【讨论】:

    【解决方案2】:

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

    然后您将相同的 null 值传递给显示函数,并且在显示内部您尝试访问 NULL 地址导致分段错误..

    作为修复,您已在 main 函数中为 head 分配内存并发送 head (&head) 的传递地址以创建和显示函数

    `struct node *create(struct node **head)
     {
          ....
    
          return head;
      }
    
    void main()
    {   
        head=malloc(...);
        head = create(&head);
        display(&head);
    }`
    

    【讨论】:

      【解决方案3】:
      void create(struct node *head){}
      

      当您在create() 中更新head 时,您实际上更新了传递的副本。您需要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;
      }
      

      【讨论】:

        猜你喜欢
        • 2013-04-28
        • 1970-01-01
        • 2017-07-19
        • 1970-01-01
        • 1970-01-01
        • 2012-11-20
        • 1970-01-01
        • 1970-01-01
        • 2021-10-19
        相关资源
        最近更新 更多