在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; }; 免责声明:我没有测试这个代码,它可能是错误的… (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |