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

C语言链表节点删除代码调整及箭头运算符使用疑问

链表节点删除代码的问题修复与解析

你的箭头运算符->用法是完全可行的,问题出在代码的逻辑错误上,具体问题和修复方案如下:

核心问题分析

  • 无限循环的直接原因:while循环语句末尾多了一个分号;,这会让循环体变成空语句。当tmp->next->data != x时,程序会一直卡在这个空循环里,永远不会执行{}里的tmp = tmp->next;,直接导致无限循环。
  • 内存释放逻辑错误:你先执行tmp->next = tmp->next->next;覆盖了指向目标节点的指针,之后再free(tmp->next)释放的是原目标节点的下一个节点,而非要删除的目标节点,这会造成内存泄漏,还可能破坏链表结构。

修正后的代码

node* deleteFromList(node* head, int x)
{
    node* tmp = head;
    // 移除while后的分号,让循环体正常执行
    while(tmp->next->data != x)
    {
        tmp = tmp->next;
    }
    // 先保存要删除的节点,避免指针被覆盖后丢失
    node* toDelete = tmp->next;
    // 修改链表指针,跳过目标节点
    tmp->next = tmp->next->next;
    // 释放目标节点的内存
    free(toDelete);
    return head;
}

额外说明

尽管你提到不考虑头节点、尾节点等特殊情况,但实际编写代码时,最好添加tmp和tmp->next不为空的判断,避免出现空指针访问的崩溃问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 09:30:52