【问题标题】:Getting segmentation fault in linked list在链表中获取分段错误
【发布时间】:2016-10-07 09:00:06
【问题描述】:

使用此代码删除在处理列表开始时创建的重复值 但是在使用此代码时,由于段失败而报错,否则程序运行良好。

void remove_duplicate(){
    q = start;           //list start has already been created
    while(q->next){
        q=q->next;
        if(q->id==q->next->id){    //removing duplicate values
            q->next->prev = q->prev;
            q->prev->next = q->next;
        }
    }
}

【问题讨论】:

    标签: c linked-list segmentation-fault


    【解决方案1】:

    当你是列表中倒数第二个节点时,其中q->next->next是一个空指针,那么你进入循环体(因为q->next不是NULL)并直接使q指向到最后一个节点。因此,当您下次使用 q->next 时,您将取消引用 NULL 指针并具有未定义的行为

    更改语句的顺序,并将 q = q->next 赋值放在最后。

    或者使用for 循环代替:

    for (q = start; q->next != NULL; q = q->next){
        if ...
    }
    

    【讨论】:

    • @ÐevendraSuthar 您可能会将帮助您的答案标记为已接受。这比感谢更好,因为每个人都认为这是解决方案 + 发帖人的工作得到了代表。
    【解决方案2】:

    您的问题可能出在这一行,在这里您断言存在q->next 元素:

    while(q->next)
    

    现在您将链中的下一个元素分配给您的 q,

    q=q->next;
    

    现在你的q->next 可能是NULL

    if(q->id==q->next->id)
    

    q=q->next; 移到if 块下。

    void remove_duplicate(){
    
      q = start->next;    
      if (q==NULL)
      return -1;      
      while(q->next){
    
        if(q->id==q->next->id){                
            q->next->prev = q->prev;
            q->prev->next = q->next;
        }
        q=q->next;
      }
    }
    

    【讨论】:

    • while(q->next) 正是这样做的。并且您的修复程序将在一开始就崩溃,因为 q->prev 可能是 NULL 并且您想要访问它
    • 可能是 NULL...,我现在不知道这个结构是如何定义的,我的修复解决了这个特殊问题,即在前面跳转一个节点
    • 我误读了您的解决方案。我评论的第一句话是不正确的,第二句话仍然如此。
    • 但是回头看还是会出现问题。你只是把问题从头到尾。分析是对的(我只是第一次理解错了)但问题没有解决。
    【解决方案3】:
    void remove duplicate()
    {
       q=start;
    
       while(q->next!=NULL)
       {
          if(q->id==q->next->id)
          {
             q->next=q->next->next; 
          }
    
          q=q->next;
       }
    }
    

    它可以帮助你。

    【讨论】:

    • 如果你能解释为什么它会有所帮助,你的答案会更好,最初是什么问题。
    • 这里 q 是一个指针。在这种情况下,我们开始遍历具有条件 (q->next!=NULL) 的元素。在这种情况下,我们可以找到 prev 节点的重复值。在 prev代码while循环没有完美定义我们的循环将从哪里终止,如果条件正确但在if循环内部,则在prev代码中,
    • 指针 q 指向一个节点,在 if 条件下,我们正在比较下一个节点的 id,如果匹配,则在 q->next 中保存下一个节点(重复节点)和下一个的地址复制节点持有第三个节点的地址然后步骤(q->next=q->next->next)定义,此时在指向节点的next中放入第三个节点的地址并断开与此时重复节点和指向节点。
    • 您可以编辑您的答案并添加此信息,而不是将其发布在 cmets 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 2023-04-04
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多