我在使用C的stdlib的free()
函数时遇到问题,就我的知识而言,此函数一次只能删除链表的给定节点,我如何使用此函数删除整个循环链表?
我是否必须使一个指针指向循环链表的头部并开始逐个节点释放,所以要小心使每个指针从一个节点到下一个节点,在我可以释放之前将其指向NULL那个节点?如果可以的话,如何释放头节点?
答案 0 :(得分:1)
理论上,您可以重新分配列表的整个堆内存,并将其传递给自由函数。 但是,清理链表的最安全方法是迭代和释放每个节点。
这是析构函数的示例。
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;
答案 1 :(得分:-1)
为什么这不起作用?
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作为索引。