我遇到了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作为索引。