c-获取链表中的分段错误



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

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

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

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

或者使用for循环:

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

您的问题可能在于这一行,在这里您断言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;
  }
}
void remove duplicate()
{
   q=start;
   while(q->next!=NULL)
   {
      if(q->id==q->next->id)
      {
         q->next=q->next->next; 
      }
      q=q->next;
   }
}

它可以帮助你。

相关内容

  • 没有找到相关文章

最新更新