C:如何释放链表中的节点?

如何释放在另一个函数中分配的节点?

struct node { int data; struct node* next; }; struct node* buildList() { struct node* head = NULL; struct node* second = NULL; struct node* third = NULL; head = malloc(sizeof(struct node)); second = malloc(sizeof(struct node)); third = malloc(sizeof(struct node)); head->data = 1; head->next = second; second->data = 2; second->next = third; third->data = 3; third->next = NULL; return head; } 

我在main()中调用了buildList函数

 int main() { struct node* h = buildList(); printf("The second element is %d\n", h->next->data); return 0; } 

我想释放头,第二和第三变量。
谢谢。

更新:

 int main() { struct node* h = buildList(); printf("The element is %d\n", h->next->data); //prints 2 //free(h->next->next); //free(h->next); free(h); // struct node* h1 = buildList(); printf("The element is %d\n", h->next->data); //print 2 ?? why? return 0; } 

两个打印2.不应该免费调用(h)删除h。 如果是这样的话,为什么h-> next->数据可用,如果h是免费的。 当然,’第二’节点没有被释放。 但是由于头部被移除,它应该能够引用下一个元素。 这里的错误是什么?

用于释放列表的迭代函数:

 void freeList(struct node* head) { struct node* tmp; while (head != NULL) { tmp = head; head = head->next; free(tmp); } } 

该function的作用如下:

  1. 检查head是否为NULL,如果是,则列表为空,我们只返回

  2. head保存在tmp变量中,并使head指向列表中的下一个节点(这在head = head->next

  3. 现在我们可以安全地free(tmp)变量,并且只指向列表的其余部分,返回步骤1

只需迭代列表:

 struct node *n = head; while(n){ struct node *n1 = n; n = n->next; free(n1); } 

你总是可以递归地这样做:

 void freeList(struct node* currentNode) { if(currentNode->next) freeList(currentNode->next); free(currentNode); } 

一个function可以完成这项工作,

 void free_list(node *pHead) { node *pNode = pHead, *pNext; while (NULL != pNode) { pNext = pNode->next; free(pNode); pNode = pNext; } }