如何在C中删除整个循环链表?

时间:2018-10-05 08:47:20

标签: c linked-list free circular-reference

我在使用C的stdlib的free()函数时遇到问题,就我的知识而言,此函数一次只能删除链表的给定节点,我如何使用此函数删除整个循环链表?

我是否必须使一个指针指向循环链表的头部并开始逐个节点释放,所以要小心使每个指针从一个节点到下一个节点,在我可以释放之前将其指向NULL那个节点?如果可以的话,如何释放头节点?

2 个答案:

答案 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作为索引。