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

单链表节点删除C语言程序出现段错误问题排查

单链表删除节点段错误的问题分析与修复

你的Delete函数存在几个关键问题,直接触发了段错误:

  • 未处理尾节点删除场景:当要删除的节点是链表最后一个节点时,p->next为NULL,此时访问p->next->symbol、p->next->addr会触发空指针解引用,直接引发段错误。
  • 单节点链表处理缺失:如果链表只有一个节点(size=1),同样会触发上述空指针访问问题。
  • 未释放被删除节点内存:代码中用q指向了要被删除的后继节点,但没有调用free(q)释放内存,会造成内存泄漏。

修正后的Delete函数代码

void Delete(char *sym) {
    struct SymbTab *target = Search(sym);
    if (target == NULL) {
        return;
    }

    struct SymbTab *prev = NULL;
    struct SymbTab *curr = head; // 假设head是你的链表头节点指针,需根据实际代码调整

    // 遍历找到目标节点的前驱节点
    while (curr != NULL && curr != target) {
        prev = curr;
        curr = curr->next;
    }

    // 处理头节点删除
    if (prev == NULL) {
        head = target->next;
    } 
    // 处理中间/尾节点删除
    else {
        prev->next = target->next;
    }

    // 释放目标节点内存
    free(target);
    size--;
}

关键说明

  • 改用前驱节点指向后继节点的标准删除逻辑,覆盖了头节点、中间节点、尾节点的所有场景,从根源避免了空指针访问。
  • 必须调用free(target)释放被删除节点的堆内存,避免内存泄漏。
  • 代码中假设head是链表头指针,需要根据你的实际代码调整变量名。

内容的提问来源于stack exchange,提问作者Zaynab B.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 03:15:27