使用此代码删除处理列表开始时创建的重复值 但是在使用此代码时因段失败而收到错误,否则程序运行良好。
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;
}
}
}
答案 0 :(得分:2)
如果你是列表中倒数第二个节点,q->next->next
是空指针,那么你进入循环体(因为q->next
不是NULL
)并直接使q
指向最后一个节点。因此,当您下次使用q->next
时,您将取消引用NULL
指针并具有未定义的行为。
更改语句的顺序,并将q = q->next
作业放在最后。
或者改为使用for
循环:
for (q = start; q->next != NULL; q = q->next){
if ...
}
答案 1 :(得分:1)
你的问题可能在于这一行,你断言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;
}
}
答案 2 :(得分:0)
void remove duplicate()
{
q=start;
while(q->next!=NULL)
{
if(q->id==q->next->id)
{
q->next=q->next->next;
}
q=q->next;
}
}
它可以帮助你。