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

C语言链表首节点删除异常:删除后student_ID为垃圾值

问题排查与解决

问题现象

向链表插入4-5个节点后,调用lilPrint可正常打印信息;但删除首节点时,节点未被完全删除:打印时该节点的student_ID变为垃圾值,其余字段仍正常显示。

核心原因

  1. 主函数未更新链表头指针:在main的case 2中,调用Del(id,list)后,没有将返回的新链表头赋值给list。删除首节点时,Del函数会返回新的头指针,但原list变量仍指向已被free的内存块,后续打印时访问的是已释放的野指针,导致student_ID出现垃圾值(其余字段可能因内存暂未被覆盖而显示正常)。
  2. Del函数逻辑冗余且存在风险:函数开头的if判断与后续while循环内的处理重复,且未先检查curr是否为NULL(若传入空链表会直接触发空指针访问错误)。

解决步骤

步骤1:修复主函数的调用逻辑

在main的case 2中,将Del(id,list);改为:

list = Del(id, list);

这样才能让主函数的链表头指针指向删除后的新链表。

步骤2:优化Del函数的逻辑

删除冗余的开头判断,统一用循环处理所有节点,同时增加空链表的判断:

StudentPtr Del(int id, StudentPtr list)
{
    StudentPtr curr = list, prev = NULL;

    // 处理空链表情况
    if (list == NULL) {
        return NULL;
    }

    while (curr != NULL)
    {
        if (curr->student_ID == id)
        {
            if (prev == NULL) {
                // 删除首节点,更新链表头
                list = curr->next;
            } else {
                // 删除中间/尾节点,调整前驱指针
                prev->next = curr->next;
            }
            free(curr);
            return list;
        }
        prev = curr;
        curr = curr->next;
    }
    // 未找到对应ID的节点,返回原链表
    return list;
}

额外补充

代码中还有两处未定义的函数调用:Lucky(list)和my_round(...),需要补充实现或替换为标准库函数(比如用round(),需包含<math.h>头文件),否则编译会报错。


内容的提问来源于stack exchange,提问作者hsn saed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 23:20:29