当我尝试从单链表中删除节点时,为啥我的 C 程序会崩溃

Posted

技术标签:

【中文标题】当我尝试从单链表中删除节点时,为啥我的 C 程序会崩溃【英文标题】:Why does my C Program crash when I try to delete a node out of a singe linked list当我尝试从单链表中删除节点时,为什么我的 C 程序会崩溃 【发布时间】:2022-01-15 12:59:54 【问题描述】:

我目前正在用 C 语言创建一个程序,它基本上是一个链表内的链表。内部列表是字符,外部列表是单词。不幸的是,我在删除一些外部节点(单词)和释放它们的内存时遇到了问题。我的程序不断崩溃,我不知道为什么。编译器没有给我任何警告或错误,我一直在寻找修复几个小时。任何可以查看代码的人都可以得到任何帮助!谢谢!

*void deleteWord (Node* Node, int index)
int counter = 0;
if (Node == NULL)
    return;

while (Node->next != NULL && counter != (index - 1))
    Node = Node->next;
    counter++;

struct node* wordTemp = Node->next;
//Node->next = Node->next->next;

while (wordTemp->word != NULL)
    InnerNode* letterTemp = wordTemp->word->next;
    free(wordTemp->word);
    wordTemp->word = letterTemp;

free(wordTemp);
return;

【问题讨论】:

为什么是counter != (index - 1)counter 从零开始,index 从 1 开始? 这样我就得到了我真正想要释放的节点之前的节点,所以我可以将它与我想要释放的节点之后的节点链接 嗯好的。但是,如果您传入索引 0,您将获得列表中的最后一个节点,这可能不是您想要的。你也需要处理极端情况。 【参考方案1】:

似乎您正在释放 Node->next(存储在 wordTemp 中),而没有重新分配它,实际上破坏了链表中的链接,所以现在 Node->next 指向已删除的内存。

【讨论】:

我正在将当前节点与我要删除的节点之后的节点链接。 node->next 变成 node->next->next,所以本质上是把前一个节点和下一个节点连接起来,并复制一个我想免费的节点,称之为 wordTemp

以上是关于当我尝试从单链表中删除节点时,为啥我的 C 程序会崩溃的主要内容,如果未能解决你的问题,请参考以下文章

C语言 单链表

为啥当我尝试创建一个从我的图书馆中删除书籍的功能时会出现错误?

从单链表中删除最后一个节点

当我尝试重新分配()结构指针数组时,为啥我的 C 程序会崩溃?

从单链接列表中删除节点 - 使用MALLOC / FREE

c/c++语言创建单链表新结点时为啥不直接用结点对象,如直接lnode p;而是非要用指针加malloc或new实现?