自引用结构体

2025 年 5 月 13 日 | 阅读 12 分钟

自指结构是指指向同类型结构的结构。它包含一个或多个最终指向同类型结构的指针。

  • 结构是C和C++中一种用户定义的数据结构类型。
  • 创建结构的主要好处是它可以包含不同的预定义数据类型。
  • 它使用struct关键字和结构名称初始化,后跟此struct关键字。
  • 我们可以在同一个结构中轻松地包含不同的数据类型,如整数值、浮点数、字符等。
  • 它降低了程序的复杂性。
  • 使用单个结构可以将值和数据集保存在一个地方。
  • 在C++编程语言中,放置struct关键字是可选的或非强制的,但在C编程语言中是强制的。
  • 自指结构在创建链表等其他数据结构方面起着非常重要的作用。
  • 在这类结构中,同类型结构的对象的指针指向相同的数据结构,并引用同类型结构的数据类型。
  • 它可以有一个或多个指针作为其成员,指向同类型的结构。
  • 自指结构广泛用于动态数据结构,如树、链表等。
Self-referential structure

为什么我们需要自指结构?

自指结构在链表、树、图等数据结构中发挥着至关重要的作用。通过使用结构,我们可以轻松高效地实现这些数据结构。对于定义特定节点,结构起着非常重要的作用。在链表中,结构用于存储数据信息和给定链表中下一个节点的地址。主要数据部分是整数类型,链接地址部分是指针类型,它保存下一个节点的地址,以便最终形成链接。

正如我们所知,链表的作用是存储相同类型的数据元素,其中地址位置不是连续的。在这个线性链表中,当前节点保存下一个节点的地址,从而最终形成当前节点和下一个节点之间的链接。

在链表中,我们将定义一个通用结构,该结构包含数据和地址指针,用于携带下一个节点的地址,以便形成多个节点,我们通过节点结构来形成每个节点。

与数组等静态数据结构不同,数组的大小限制了可以轻松插入数组的元素数量,自指结构可以动态地扩展或收缩。

在自指结构中,诸如插入或删除节点之类的操作涉及直接修改指针。

链表

  • 链表是一种有用的数据存储方法,在C编程语言中很容易实现。
  • 有几种链表,包括单向链表、双向链表二叉树
  • 每种类型都适合特定的数据存储类型。
  • 这些列表的共同点是,数据项之间的链接由它们本身包含的信息(以指针的形式)定义。
  • 链表与数组明显不同,在数组中,数据项之间的链接是由数组的布局和存储产生的。

在这里,我们将使用链表概念更详细地讨论自指结构。

让我们通过下面的示例更详细地理解自指结构的概念

示例 1:在C编程语言中创建随机自指结构。

示例 2:在Python编程语言中创建随机自指结构。

自指结构的类型

  1. 单链自指结构
  2. 多链自指结构

单链自指结构

顾名思义,我们可以轻松预测这些结构包含单个链接,主要是指向同类型结构的唯一一个指针链接。为了更好地理解,我们可以将此概念与单向链表联系起来。

在单向链表中,只有一个指针存储下一个节点的地址,该指针变量本身就是结构节点类型。主要用于当我们想要通过从不同地址获取数据项并将它们全部连接起来,方法是将一个数据项的地址存储到另一个节点的链接部分时。这样,我们就可以通过使用这些连接链轻松地连接所有数据项。

让我们通过一个例子来看看单链自指结构的工作原理

上述程序的输出为

Self-referential structure
Self-referential structure

上述程序的输出为

36

24 

多链自指结构

顾名思义,我们可以轻松预测这类结构包含多个链接,这里我们将使用指向同类型结构的两个指针链接,为了更好地理解,我们可以将此概念与双向链表联系起来。

在双向链表中,两个单指针存储下一个节点和上一个节点的地址,该指针变量本身就是结构节点类型。主要用于当我们想要通过从不同地址获取数据项并将它们全部连接起来,方法是将一个数据项的地址存储到另一个节点的链接部分时。这样,我们就可以通过使用这些连接链轻松地连接所有数据项。

让我们通过一个例子来看看多链自指结构的工作原理

上述程序的输出为

Self-referential structure

上述程序的输出为

15            20            25
15            20            25
15            20            25