没有双重链表

我在C程序中使用双向链表。 我对释放记忆感到困惑。

  1. 我应该逐节点地释放列表吗?
  2. 或者,通过将头节点和尾节点分配给NULL?

您必须遍历列表并释放每个节点。 如果只将head和tail指针设置为NULL,那么列表节点仍然在堆中,并且没有指向它们的指针,这是典型的内存泄漏。

这是一些伪代码:

Node* current = head; while( current != NULL ) { Node* next = current->Next; free( current ); current = next; } // done 

你当然可以从头到尾遍历 – 没有任何重大区别。

如果它们是动态分配的,则需要释放节点。 请记住,如果您的节点持有指向某些数据的指针,并且该数据也是动态分配的,那么您也需要释放它。

就像是:

 list_node* node = head; while (node) { /* depends */ /* free(node->data); */ list_node* next = node->next; free(node); node = next; } 

你必须释放每个节点。 如果只是将head和tail节点设置为NULL,则会泄漏为列表分配的所有内存。