【问题标题】:How do I delete an entire circular linked list in C?如何在 C 中删除整个循环链表?
【发布时间】:2019-03-10 17:34:47
【问题描述】:

我对C的stdlib的free()函数有问题,据我所知,这个函数一次只能删除链表的给定节点,我如何使用这个函数删除整个循环链表?

我是否必须创建一个指向循环链表头部的指针并开始逐个节点地释放节点,并注意使每个指针从一个节点到下一个节点,在我可以释放之前指向 NULL那个节点?如果是这样,我该如何释放头节点?

【问题讨论】:

  • 是的,只要走链子,一个一个地删除它们。记住你从哪里开始。

标签: c linked-list free circular-reference


【解决方案1】:

所以这是删除整个循环链表的方法:

    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);

【讨论】:

    【解决方案2】:

    为什么这不起作用?

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

    【讨论】:

    • 链表中没有索引。
    • 我的链表的节点定义为 struct Node { float body;整数索引;结构节点*船尾; }; typedef struct Node* Polinomial;
    【解决方案3】:

    理论上,您可以重新分配列表的整个堆内存并将其传递给空闲函数。 然而,清理链表最安全的方法是迭代和释放每个节点。

    这是一个析构函数的例子。

    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;
    

    【讨论】:

    • 你为什么用两个**而不是一个,不应该只是一个指向列表开头的指针吗?
    • 这是一个指针,你是对的。但是当你需要一个指向 free() 的指针并设置为 null 时。因此你必须传递这个指针的指针,它是一个**指针。
    • 我不明白,你能解释一下为什么我写的这段代码不起作用吗?
    猜你喜欢
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 2021-06-07
    相关资源
    最近更新 更多