簡體   English   中英

如何在C中刪除整個循環鏈表?

[英]How do I delete an entire circular linked list in C?

我在使用 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;

所以這是刪除整個循環鏈表的方法:

    node* clear(node *n){
        if (n->next == head){
            free(n);
            n = NULL;
            return n;
        }
        n->next = clear(n->next);
        free(n);
        n = NULL;
        return n;
    }

調用函數為:

head = clear(head);

為什么這不起作用?

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 作為索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM