You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:05:26