c - 如何在C中仅释放链表中的单个节点?

标签 c

如何仅释放链表中的单个节点?下面的代码释放了整个链表,但我只想释放链表中的一个节点。

//Here's my code for delete

while(headPtr!=NULL)
{
    temp = headPtr;
    headPtr = headPtr->next;
    if(strcmp(temp->fname, stdfname) ==0 && 
       strcmp(temp->sname, stdsname) ==0  )
    {
        free(temp);
    }
}

最佳答案

你首先需要知道前一个节点。因此,您需要进行迭代,直到找到要删除的节点。在这个过程中你需要记住前一个节点。然后你需要连接上一个和下一个节点,从而“脱钩”你要删除的节点。

currentNode = headNode;
previousNode = NULL;
while (currentNode != NULL) {
    if (currentNode != nodeToDelete) {
        // Not the node we want to delete yet,
        // go on to next node.
        previousNode = currentNode;
        currentNode = currentNode->next;
        continue;
    }

    // We've now hit the node to delete and know the
    // previous node. Fix the structure.
    if (previousNode) {
        previousNode->next = nodeToDelete->next;
    } else {
        // No previous node means it's the head node.
        headNode = nodeToDelete->next;
    }

    // The node is now delinked from list. Delete it.
    free(nodeToDelete);
    // Stop the loop.
    break;
}

这在性能方面相当糟糕,这就是为什么有双链表。整个操作如下所示:

if (nodeToDelete->previous) {
    nodeToDelete->previous->next = nodeToDelete->next;
}
if (nodeToDelete->next) {
    nodeToDelete->next->previous = nodeToDelete->previous;
}
if (nodeToDelete == headNode) {
    headNode = nodeToDelete->next;
}
free(nodeToDelete);

如您所见,这里不需要迭代,因为每个节点都知道其上一个和下一个节点。

顺便说一句,要解决这些问题(它们非常基本),它有助于在一张纸上绘制一个简短的链接列表。绘制方框,在每个方框中写入成员名称(如 previousnext),并从这些成员到相应的其他方框绘制线条。然后考虑需要做什么才能删除该节点。它确实可以帮助您了解其工作原理。

关于c - 如何在C中仅释放链表中的单个节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5203979/

相关文章:

c - 通过 C 将线程固定到 cpuset 中的核心

MySQL用户密码问题

c++ - 如何在 OSX 上使用 C++ 中的 CGEventPost 保持按键按下?

C-如何查找和更改字符串中的单个特定字符

c++ - 当.so是纯c的时候,用c++/shell脚本写核心主程序是不是一个好的设计?

C语言指针内存?

c - 取消引用指向不完整类型的指针

python - 是否可以将 C 二进制保存的数组加载到 Python 数组中?

c++ - 为什么 p &key3 + 2 和 p (int*)&key3 + 2 在 LLVM 中会打印不同的结果?

c - 如果没有明确的 'return',函数将返回什么