双向链表元素增删异常:仅首元素可删除其余失效求排查
双向链表删除功能故障排查
你的双向链表仅能删除头节点(示例中的300),其他元素删除失败的核心原因有两个:
问题1:删除最后一个节点时触发空指针访问
在delete函数中,当要删除的是链表最后一个节点时,执行iter->next = iter->next->next;后,iter->next会变为NULL,此时后续的iter->next->prev=iter;会尝试访问空指针的成员,直接导致程序崩溃,后续代码无法执行,看起来像是删除失败。
问题2:删除头节点后未重置新头节点的prev指针
当删除头节点时,新的头节点的prev指针仍指向已被释放的旧头节点,会产生野指针,可能引发后续操作的异常。
修复后的delete函数代码
node * delete(node *r, int x){ node *temp; node *iter = r; if(r->x == x){ temp = r; r = r->next; if(r != NULL) // 重置新头节点的prev为NULL r->prev = NULL; free(temp); return r; } while(iter->next != NULL && iter->next->x != x){ iter = iter->next; } if(iter->next==NULL){ printf("Number was not found \n"); return r; } temp = iter->next; iter->next = iter->next->next; if(iter->next != NULL) // 判断非空后再修改prev指针 iter->next->prev=iter; free(temp); return r; }
修复后的运行逻辑
- 删除头节点时,会将新头节点的
prev置为NULL,避免野指针 - 删除中间或末尾节点时,先判断
iter->next是否为NULL,仅在非空时修改prev指针,避免空指针访问
测试你的main函数,修复后将能正常删除所有存在的元素,输出如下:
300 350 400 450 500 Number was not found 350 400 450 500 350 400 450 400 450
内容的提问来源于stack exchange,提问作者sabina aliyeva
相关产品推荐
相关产品推荐

