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

