加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C中释放双向链表

发布时间:2020-12-16 03:34:42 所属栏目:百科 来源:网络整理
导读:我在C中有一个双重链接列表,我对如何释放它感到困惑.我知道我必须遍历列表释放每个节点.混淆的地方在于我的每个节点都有一个指向其他数据的指针,我不确定如何释放它. 我的双重链表看起来像这样: typedef struct Node_ Node;typedef struct List_ List;struc
我在C中有一个双重链接列表,我对如何释放它感到困惑.我知道我必须遍历列表释放每个节点.混淆的地方在于我的每个节点都有一个指向其他数据的指针,我不确定如何释放它.

我的双重链表看起来像这样:

typedef struct Node_ Node;
typedef struct List_ List;

struct Node_ {
    void *data;
    Node *next;
    Node *prev;
};

struct List_ {
    Node *firstNode;
    Node *lastNode;
};

为了释放列表,我创建了一个名为List_free()的函数,该函数遍历列表,使用Node_free()释放每个节点.这些函数看起来像这样:

void *List_free(List *list)
{
    Node *next = list->firstNode;

    while(next)
    {
        Node *node = next;
        next = node->next;
        Node_free(node);
    }

    free(list);
}

void Node_free(Node *node)
{
    free(node->data);
    free(node);
}

这将会落到哪里,node->数据是指向另一个结构的指针,该结构本身包含指针.在我的例子中,我使用相同的列表代码来存储两个不同的结构.

我看到它的方式我有以下选择:

>创建节点包含特定数据的列表.不是很可重复使用.
>找到另一种方法来跟踪节点数据中的指针.

我是在思考正确的方向还是错过了一些明显的东西?这是我第一次尝试C,所以如果这完全错了,我不会感到惊讶.

解决方法

一种解决方案是提供负责正确释放节点的函数指针.
typedef void(*NodeDataFreeFn)(void*);

List_free被修改如下:

void *List_free(List *list,NodeDataFreeFn data_free)
{
    Node *next = list->firstNode;

    while(next)
    {
        Node *node = next;
        next = node->next;
        (*data_free)(node->data);
        free(node);
    }
    free(list);
}

示例data_free:

void data_free_fn(void* data_ptr) {
    // Add your custom stuff here.
    free(data_ptr);
}

对List_free的示例调用:

List_free(my_list,data_free_fn);

如果您不想通过参数传递数据自由函数指针,则可以将其存储到List结构中,而不是:

struct List_ {
   Node *firstNode;
   Node *lastNode;
   NodeDataFreeFn data_free;
};

免责声明:我没有测试这个代码,它可能是错误的…

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读