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

文章目录

前言

一、链表的概念及结构

1.单链表的逻辑结构

2.单链表的物理结构

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

三、无头单向非循环链表

四、带头双向循环链表


前言

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

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

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

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


一、链表的概念及结构

链表是一种 物理存储结构上非连续 、非顺序的存储结构,数据元素的 逻辑顺序 是通过链表
中的 指针链接 次序实现的 。

1.单链表的逻辑结构

2.单链表的物理结构

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

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

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

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

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

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

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

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


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

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

1. 单向、双向

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

3. 循环、非循环

其中,最常用的两种是:

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

三、无头单向非循环链表

结构简单 ,一般不会单独用来存数据。实际中更多是作为 其他数据结 构的子结构 ,如哈希桶、图的邻接表等等。
代码实现与详解另附文章,链接如下:

四、带头双向循环链表

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

持续更新中……

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值