数据结构论坛

注册

 

发新话题 回复该主题

全方面解析链表2022最新版 [复制链接]

1#

1、前言

学生管理系统、学生成绩管理系统、教师管理系统、图书馆管理系统、通讯录管理系统、采购、销售和存储管理系统……这些熟悉的名字只是无数C语言从业者除了唱歌、跳舞、RAP和篮球之外必须克服的障碍。无论是作为课程设计还是最终工作,都有大量新手落选。按照书中的内容修改常规是行不通的。在网上找到的代码比我写的更不可靠……毕竟,我也是在这场灾难中幸存下来的恶魔。

很大一部分原因是链接列表(XXX管理系统的核心数据结构)不像int、long和char等基本数据类型那样可爱和简单,这让人学习起来很难过。

我们都知道简单的链接列表。本文是关于Linux内核链接列表的。拿一个旧瓶子,放一些新酒进去。

该节点仅包含指向前置节点和后续节点的指针。我们在哪里存储数据?

以学生管理系统为例,我们调整了代码并将链接列表的节点放置在数据结构中。这样,抽象(链表结构)不再依赖于细节(数据类型),细节(数据)依赖于抽象(链表)。利用依赖反转的思想,我们完成了数据和结构的解耦。

可以发现,与之前的代码相比,经过调整后,我们的链表操作函数不再关心数据结构structstudent的具体细节,所有操作都基于structlist_Node是一个链表节点,也就是说,我们可以很容易地用structteacher替换structstuden,而无需修改链表操作的任何代码。

使用公共链接列表和公共链接列表之间的节点比较图,我们可以更直观地看到它们之间的结构差异。对于公共链表,节点本身包含数据,节点上的操作是对数据字段和指针字段的整体操作;对于通用链接列表,数据本身包含节点,节点上的操作仅与本地指针字段相关,而与数据字段无关。

2、链表

链接列表是一种线性列表。它通过指针将一系列数据节点连接到数据链中。与静态数组相比,链表具有更好的动态性能。在建立链接列表时,它不需要事先知道数据总量。它可以随机分配空间并有效地将数据插入到链接列表中。

单链表是最简单的链表。其特点是只有一个指针字段指向后续节点。因此,只能从头到尾遍历单个链接列表。尾部节点指针字段通常指向NULL空指针。

双链表在单链表的基础上,在前一节点上增加一个指针字段,可以实现双向遍历。

循环链接列表的尾部节点指针字段指向第一个节点。它的特点是可以从任何节点访问整个链接列表。如果循环链表是在双链表的基础上实现的,那么整个链表可以从任意节点双向访问。

可以看出,这样的链接列表在维护单个数据方面没有问题,例如上面的structstudent。然而,在另一个程序的上下文中,我们的数据字段不是structstudent,而是structteacher或structany_Thing,显然,我们必须为这些不同的数据类型重新定义一组链表操作接口,并且我们的代码不能完全重用(Ctrl+C、Ctrl+V)。简而言之,我们需要一个通用的链接列表。

无类型指针可以在某种程度上实现抽象数据类型,但这意味着我们的代码将充满强制转换和回调函数。您必须始终自己检查数据类型,如果不小心就会出现内存错误。

显然,这不是我们想要的。我们从Linux内核的链表实现中删除数据。由于它是一个与数据分离的链接列表,因此链接列表的节点不应包含数据字段本身。

分享 转发
TOP
发新话题 回复该主题