如何在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 ),并从这些成员中绘制线条到相应的其他框。 然后考虑为删除节点需要做什么。 它真的可以帮助您了解其工作原理。

除非你删除的节点是头部,否则列表的头部永远不会改变。 您应该将临时指针向下移动到列表中。 您还需要在删除节点时修复链接,请注意,您需要注意三种情况,以及第一个节点需要特殊处理的情况。 我会给你代码的骨架,但由于我不知道你的列表是单链还是双链,我会把指针更新给你。

 temp = headPtr; prev = NULL; while (temp != NULL) { if (strcmp(temp->fname, stdfname) == 0) && strcmp(temp->sname, stdsname) == 0) { if (prev == NULL) { // head node ... } else if (temp->next == NULL) { // tail node ... } else { // interior node ... } break; // stop when done } prev = temp; temp = temp->next; }