使用此代码删除在处理列表时创建的重复值开始但在使用此代码时,由于段错误而失败,否则程序运行良好。
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;
}
}
它可以帮助你。