C语言链表详解 & 两类重要链表的实现

简介: 本文详细介绍了链表数据结构,包括链表的非连续、非顺序的物理存储和逻辑顺序通过指针链接的概念。文章以C语言实现链表,并计划更新两种链表(无头单向非循环链表和带头双向循环链表)的代码实现。目前提供了链表的逻辑和物理结构图解,帮助读者理解链表的工作原理,强调了画图在学习数据结构中的重要性。此外,文章指出链表的分类有多种组合形式,并预告将对常用类型的链表进行代码实现。

前言


本文详解对数据结构之链表的理解、链表的两种理解结构与分类以及两种重要链表的代码实现(由于这两类链表的代码实现部分篇幅较长,写在了新的博客文章里,通过链接的方式链入本文)。


本文采用C语言实现数据结构代码


本文将持续维护更新优化,笔者在后续学习种遇到更好的解读、易错点、OJ题讲解等链表相关知识点,也会贴在本贴。希望本文对诸位读者学习链表有所帮助。


提示:预计在3个工作日内更新完那两篇代码详解。更新完毕后这句提示会删除。


一、链表的概念及结构


链表是一种 物理存储结构上非连续 、非顺序的存储结构,数据元素的 逻辑顺序 是通过链表

中的 指针链接 次序实现的 。


1.单链表的逻辑结构



2.单链表的物理结构



逻辑结构相对而言比较抽象,一些初学者难以理解,是非常正常的,不必心急。当用逻辑结构想不通时,我们不妨从物理结构开始理解。


当然,在实际的存储中,根本不可能有像逻辑结构中的什么“箭头”指来指去,不同内存单元之间的联系肯定不是通过这些“箭头”产生的。事实上,逻辑结构中“箭头指向”的本质就是指针。你的箭头指向我,实际上是你的指针域中存放的是我的地址。两个原本毫不相干的内存单元,通过指针域中存放的内存地址互相串联起来,形成抽象意义上的链式结构。



思考了一下,想到一个绝妙的比方可以帮助大家理解:



这是网络上的一个“坑人小妙招”,当你看它时,顺着序号到处找。每次提起链表我就会想起这张图。


把上图中每一行文字想象成链表中不同的内存单元。当你从头开始在浏览这些文字时,你其实在做一件事情:遍历链表。然而,每一行文字中都包含了另外某一行的行号。如果没有这些行号,每一行之间毫无关系,看完一行,你会本能地按照顺序看下一行。但有了这些行号,你在看完一行后,不再从上到下看,而是顺着行末的“请看x”去寻找“第x行”。像穿针引线一般,你看完了全部文字(尽管作为一个整人小妙招,里面的文字毫无意义)。


总结一下:每一行文字,相当于内存中独立的内存单元,即链表中的节点;每行行末的“请看x”,相当于节点中的指针域;在跟着这些文字的思路进行阅读的你,即一个遍历链表用的指针(后面会提到)。


初学阶段,在阅读代码或做题时,如果一下子难以get到题意,可以画逻辑结构图或物理结构图。其中物理结构图更加清晰直观,适合我们初学时帮助理解。当熟练以后,就可以用逻辑结构图理解了。


注意:画图是学习数据结构非常重要的一个方法,就像做数学题要随手画图一样。一定要养成随手画图的好习惯!


二、链表的分类与代码实现


实际中链表的结构非常多样。以下情况组合起来有8种链表结构:


1. 单向、双向

2. 带头、不带头(头指哨兵位的头节点)

3. 循环、非循环



其中,最常用的两种是:



接下来,我们重点讲解一下这两类重要的链表结构:无(有)头单向非循环链表以及带头双向循环链表。


三、无头单向非循环链表


结构简单 ,一般不会单独用来存数据。实际中更多是作为 其他数据结 构的子结构 ,如哈希桶、图的邻接表等等。

代码实现与详解另附文章,链接如下:


http://t.csdn.cn/JBt2W


四、带头双向循环链表


结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。这个结构虽然结构复杂,但使用代码实现后会发现,该结构会带来很多优势,实现反而简单了。


持续更新中……





                       

相关文章
|
21天前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
48 4
|
1月前
|
存储 缓存 C语言
C语言:链表和数组有什么区别
C语言中,链表和数组是两种常用的数据结构。数组是一种线性结构,元素在内存中连续存储,通过下标访问,适合随机访问且大小固定的情况。链表由一系列不连续的节点组成,每个节点存储数据和指向下一个节点的指针,适用于频繁插入和删除操作的场景,链表的大小可以动态变化。
|
1月前
|
C语言
无头链表再封装方式实现 (C语言描述)
如何在C语言中实现无头链表的再封装,包括创建节点和链表、插入和删除操作、查找和打印链表以及销毁链表的函数。
27 0
|
1月前
|
C语言
C语言链式结构之有头单链表再封装写法
本文介绍了如何使用C语言对有头单链表进行封装,包括节点的创建、链表的初始化、数据的插入和删除,以及链表的打印等功能。
17 1
|
1月前
|
C语言
C语言结构体链式结构之有头单链表
文章提供了一个C语言实现的有头单链表的完整代码,包括创建链表、插入、删除和打印等基本操作。
23 1
|
21天前
|
C语言
【数据结构】双向带头循环链表(c语言)(附源码)
本文介绍了双向带头循环链表的概念和实现。双向带头循环链表具有三个关键点:双向、带头和循环。与单链表相比,它的头插、尾插、头删、尾删等操作的时间复杂度均为O(1),提高了运行效率。文章详细讲解了链表的结构定义、方法声明和实现,包括创建新节点、初始化、打印、判断是否为空、插入和删除节点等操作。最后提供了完整的代码示例。
39 0
|
1月前
|
测试技术 C语言
单链表之无头链表(C语言版)
本文详细介绍了使用C语言实现无头单链表的方法,包括节点和链表结构的定义、链表的创建与销毁、节点的插入与删除,以及链表的打印等功能。文章通过具体的代码示例,展示了如何在无头链表中进行头插法、尾插法、自定义位置插入和删除,以及如何清空和销毁链表。
33 0
单链表之无头链表(C语言版)
|
5月前
|
存储 缓存 前端开发
【数据结构/C语言】深入理解 双向链表
【数据结构/C语言】深入理解 双向链表
|
1月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
25 0
|
2月前
|
存储 C语言
C语言程序设计核心详解 第九章 结构体与链表概要详解
本文档详细介绍了C语言中的结构体与链表。首先,讲解了结构体的定义、初始化及使用方法,并演示了如何通过不同方式定义结构体变量。接着,介绍了指向结构体的指针及其应用,包括结构体变量和结构体数组的指针操作。随后,概述了链表的概念与定义,解释了链表的基本操作如动态分配、插入和删除。最后,简述了共用体类型及其变量定义与引用方法。通过本文档,读者可以全面了解结构体与链表的基础知识及实际应用技巧。