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

C语言删除双向链表头节点后无输出问题排查

问题成因分析

核心原因是C语言函数参数默认采用值传递规则,指针参数也不例外:

  • 你定义的delete_head函数的形参head是独立于main函数里指针a的局部变量,调用delete_head(a)时,只是把a存储的地址值复制给了形参head
  • 函数内部修改形参head的指向(head = head->next)只会改变局部变量head的值,完全不会影响外部main函数里a的指向
  • 你在delete_head里已经把被删除的旧头节点的next指针设为NULL,此时a仍然指向已经被摘除的旧头节点,遍历a自然只能拿到旧头节点的值,不会输出你预期的后续节点内容
  • 当你接住delete_head的返回值时,返回值是更新后的新头节点地址,用这个新地址遍历自然能得到正确结果
修复方案

你不需要额外创建新指针,直接把返回值赋值回原指针a即可:

// 把原来的delete_head(a);改成下面的写法
a = delete_head(a);
traverse(a);
额外注意事项

你当前的delete_head函数存在边界判断缺失问题:

  • 没有判断传入的head是否为NULL,也没有判断链表只有一个节点的场景
  • 如果链表仅剩一个节点,执行head = head->next后head为NULL,再执行head->prev = NULL会直接触发空指针访问崩溃
    可以补充边界判断优化:
struct node *delete_head(struct node *head)
{
    if (head == NULL) return NULL;
    struct node *ptr = head;
    head = head->next;
    if (head != NULL) {
        head->prev = NULL;
    }
    ptr->next = NULL;
    free(ptr); // 补充释放旧头节点内存,避免内存泄漏
    return head;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 07:45:02