从Loudon算法书中实现单链表

时间:2016-09-05 19:09:12

标签: c algorithm linked-list

我正在阅读Kyle Loudon的使用C 进行掌握算法,目前我正在努力与Loudon在第5章中实现单链接列表。

以下是源代码的链接。我很抱歉没有在这里发帖,因为它们有点长。

list.h

list.c

我的问题与 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()函数中用于初始化链表的目的是什么?

非常感谢您的时间和帮助!源代码链接在上面。

2 个答案:

答案 0 :(得分:1)

这是一个函数指针。当您创建此列表的实例时,您还必须将init_list函数交给一个用于销毁信息的函数。

链表的目的是存储信息,链表结构是为了给出一些结构 这个数据。因此,列表的每个元素都包含指向某些数据的指针,以及指向列表中下一个元素的指针。但是,您希望列表能够处理多种数据。

假设您要删除列表中的元素,那么基本上有两件事情必须发生:

  1. 需要销毁数据

  2. 必须恢复链接列表结构。这意味着您删除的元素的前身必须指向 列表中的下一个元素。

  3. 由于您事先不知道列表中的数据指针将包含哪种数据,因此对于步骤1,提供了一个函数指针来处理该数据的销毁。

答案 1 :(得分:0)

链表是由节点组成的数据结构,每个节点包含或链接到一个数据。

destroy函数只会破坏列表中的一个节点。

list_destroy函数会破坏整个列表。

在给定的实现中,节点实际上包含指向其destroy函数的指针,并通过解除引用该指针来访问它。当它发生时(到目前为止),所有节点都指向相同的销毁函数。但是,对于更复杂的数据结构,此模式允许多种类型的节点位于数据结构中。而list_destroy函数的等效函数将正确地正确销毁每个节点类型,因为节点知道应该如何销毁它。