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

C语言单链表删除指定值节点仅移除一个问题排查

问题原因
  • 删除函数仅执行单次删除:deleteNode 函数找到第一个匹配目标值的节点并完成删除后就直接终止运行,没有遍历完整条链表查找所有符合条件的节点,因此只能移除1个目标节点。
  • 头节点删除逻辑错误:当需要删除的节点是头节点时,原代码仅释放了头节点的内存,没有更新头指针 *head 指向新的头节点,会导致链表断裂,触发野指针访问问题。
  • 代码存在语法不规范问题:addBack 函数的第一个参数类型写为 struct node **,和定义的结构体名 struct NODE 大小写不统一,部分编译器会抛出类型不匹配错误;参数名 new 是C++关键字,虽然C语言中可正常使用,但易产生歧义。
修复方案
  1. 重构deleteNode函数逻辑:循环遍历整条链表,匹配到所有目标值节点都执行删除操作;删除头节点时正确更新头指针,删除任意节点后都继续向后遍历,不要提前返回。
  2. 修正addBack函数的参数类型为struct NODE **,将deleteNode的参数名new改为target避免歧义。

修正后的核心代码

deleteNode 函数

void deleteNode(struct NODE** head, int target)
{
    struct NODE *curr = *head, *prev = NULL;
    while (curr != NULL) {
        if (curr->value == target) {
            // 处理头节点删除场景
            if (prev == NULL) {
                *head = curr->prev;
                free(curr);
                curr = *head;
            } 
            // 处理普通节点删除场景
            else {
                prev->prev = curr->prev;
                free(curr);
                curr = prev->prev;
            }
        } 
        // 节点不匹配,向后移动指针
        else {
            prev = curr;
            curr = curr->prev;
        }
    }
}

addBack 函数定义修正

// 原参数类型struct node改为和结构体定义一致的struct NODE
void addBack(struct NODE **head, int val)

修改完成后调用deleteNode即可删除链表中所有值为3的节点。

内容的提问来源于stack exchange,提问作者Steven Yelnats

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 07:36:10