我遇到了C的stdlib的free()函数的问题,我的知识这个函数一次只能删除链表的给定节点,如何使用这个函数删除整个循环链表?
我是否必须使指针指向循环链表的头部,并且逐个节点地自由,并且小心地使每个指针从下一个节点开始,在我可以释放该节点之前将其指向NULL?如果是这样,我如何释放头节点?
理论上,您可以重新分配列表的整个堆内存并将其传递给自由函数 . 但是,清理链表的最安全方法是迭代并释放每个节点 .
这是析构函数的一个例子 .
void destroy_link_list(linked_list_t** link_list) { node_t* head = (*link_list)->start_node; while(head != NULL) { node_t* temp = head->next; free(head->data_list); head->data_list = NULL; free(head); head = temp; } (*link_list)->start_node = NULL; free(*link_list); *link_list = NULL; }
此链接列表如下所示
typedef struct node node_t; struct node { int unique_id; node_t* next; void* data_list; }; typedef struct linked_list { int num_nodes; node_t* start_node; }linked_list_t;
为什么这不起作用?
void freePolinomial(Polinomial p){ Polinomial before, after; after = p -> aft; do{ before = after; after = after->aft; before->aft = NULL; free(before); }while(after != NULL && (after->index) != -1); p=NULL; after->aft = NULL; free(after); }
其中每个节点都有一个索引,头节点有-1作为索引 .
2 回答
理论上,您可以重新分配列表的整个堆内存并将其传递给自由函数 . 但是,清理链表的最安全方法是迭代并释放每个节点 .
这是析构函数的一个例子 .
此链接列表如下所示
为什么这不起作用?
其中每个节点都有一个索引,头节点有-1作为索引 .