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
相关产品推荐
相关产品推荐

