【问题标题】:Implementation of Singly-Linked List from Loudon's Algorithm BookLoudon算法书中单链表的实现
【发布时间】:2016-09-05 19:09:12
【问题描述】:

我正在阅读 Kyle Loudon 的 Mastering Algorithms with 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() 函数中用于初始化链表的目的是什么?

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

【问题讨论】:

  • 您表示问题已通过接受答案得到解决。请不要在标题中添加“已解决”。

标签: c algorithm linked-list


【解决方案1】:

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

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

假设你想删除列表中的一个元素,那么基本上有两件事必须发生:

  1. 数据需要销毁

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

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

【讨论】:

  • 谢谢,这是一个非常好的建议。我已经用它来改进答案了。
  • 非常感谢您的澄清。我认为我需要更多时间才能舒适地阅读 C。
  • 弗洛里安,我还有一个问题:如果 destroy 是可以设置为 free 以释放 malloc-ed 数据的函数指针,我们为什么要放置 (void data)只是“数据”作为参数?这个空白是否服务于所有类型允许的目的?谢谢。
  • 请注意,paratmer 是一个 void pointer。但实际上,这服务于所有允许的类型。 destroy 函数传递了指向数据的 void 指针,destroy 函数将知道如何处理它。举个例子,如果它实际上是存储 int,你可以传递给 list_init 一个函数,该函数将 void 指针转换为 int 指针,以便能够释放数据。
【解决方案2】:

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

destroy 函数只销毁列表中的一个节点。

list_destroy 函数销毁整个列表。

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

【讨论】:

  • 非常感谢您的评论。它现在帮助我更好地理解代码。
猜你喜欢
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-18
  • 1970-01-01
  • 2013-12-03
  • 2014-03-07
  • 1970-01-01
相关资源
最近更新 更多