我正在阅读Kyle Loudon的使用C 进行掌握算法,目前我正在努力与Loudon在第5章中实现单链接列表。
以下是源代码的链接。我很抱歉没有在这里发帖,因为它们有点长。
我的问题与 list.c 中的destroy
相关,因为它在 11 下的
void list_init(List* list, void (*destroy)(void* data))
为list->destroy = destroy
然后再次排在 24
list->destroy(data)
。
我所知道的是destroy
与函数list_destroy
不同,但我不知道它是什么。它是一个函数还是只是一个指针?它在list_init()
函数中用于初始化链表的目的是什么?
非常感谢您的时间和帮助!源代码链接在上面。
答案 0 :(得分:1)
这是一个函数指针。当您创建此列表的实例时,您还必须将init_list函数交给一个用于销毁信息的函数。
链表的目的是存储信息,链表结构是为了给出一些结构 这个数据。因此,列表的每个元素都包含指向某些数据的指针,以及指向列表中下一个元素的指针。但是,您希望列表能够处理多种数据。
假设您要删除列表中的元素,那么基本上有两件事情必须发生:
需要销毁数据
必须恢复链接列表结构。这意味着您删除的元素的前身必须指向 列表中的下一个元素。
由于您事先不知道列表中的数据指针将包含哪种数据,因此对于步骤1,提供了一个函数指针来处理该数据的销毁。
答案 1 :(得分:0)
链表是由节点组成的数据结构,每个节点包含或链接到一个数据。
destroy
函数只会破坏列表中的一个节点。
list_destroy
函数会破坏整个列表。
在给定的实现中,节点实际上包含指向其destroy
函数的指针,并通过解除引用该指针来访问它。当它发生时(到目前为止),所有节点都指向相同的销毁函数。但是,对于更复杂的数据结构,此模式允许多种类型的节点位于数据结构中。而list_destroy
函数的等效函数将正确地正确销毁每个节点类型,因为节点知道应该如何销毁它。