C语言链表删除奇数节点函数崩溃问题求助
排查链表删除奇数节点函数的崩溃问题
我帮你梳理下代码里导致崩溃的几个关键问题,以及对应的修复方案:
问题1:未处理空链表的边界情况
当传入的链表l是NULL时,你第一个判断里的l->value会直接访问空指针的成员,这会触发段错误直接崩溃,必须先做空链表判断。
问题2:头节点为奇数时仅处理一次,遗漏连续奇数头节点
如果链表开头是连续的奇数节点(比如1->3->5->2),你只删除了第一个头节点1,新的头节点3还是奇数,但代码直接进入else分支遍历,此时prev初始为NULL,后续访问prev->prox会再次触发空指针崩溃。
问题3:删除节点后未更新current指针,导致野指针访问
在else分支的循环里,删除current节点后,current仍然指向已经被free的内存地址,下一次循环访问current->value就是访问野指针,必然导致崩溃。
修正后的代码
我调整了逻辑,先处理所有开头的奇数头节点,再遍历处理中间节点,同时确保指针更新正确:
#include <stdlib.h> // 先修正头文件里的typedef笔误:原代码里的Nodo应该是node typedef struct node{ int value; struct node* prox; } node; typedef node *list; list delete_odd_numbers(list l){ node *temp; node *current; node *prev; // 先循环处理所有开头的奇数头节点 while (l != NULL && l->value % 2 != 0) { temp = l; l = l->prox; free(temp); } // 如果处理完头节点后链表为空,直接返回 if (l == NULL) { return NULL; } // 遍历处理中间的节点 prev = l; current = l->prox; while (current != NULL) { if (current->value % 2 != 0) { temp = current; prev->prox = current->prox; free(temp); // 删除后直接将current跳转到下一个有效节点 current = prev->prox; } else { // 节点是偶数,正常移动指针 prev = current; current = current->prox; } } return l; }
关键改进点说明
- 先循环清理所有开头的奇数头节点,确保链表头要么是偶数要么为空
- 增加空链表判断,从根源避免空指针访问
- 删除节点后立即更新
current指针,彻底杜绝野指针问题 - 调整
prev的初始值,避免遍历过程中出现prev为NULL的情况
内容的提问来源于stack exchange,提问作者Paolo Gasparro
相关产品推荐
相关产品推荐

