【C语言】图解链表的(2*2*2)八种类型

【C语言】图解链表的(2*2*2)八种类型_第1张图片


(一)链表的概念及结构

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

        链表的结构与火车的车厢类似,淡季的时候,车厢数会相应的减少;旺季的时候,车厢数会额外增加几节。只需将火车的某节车厢去掉或加上,不会影响其他车厢,每节车厢是独立存在的。

【C语言】图解链表的(2*2*2)八种类型_第2张图片

        车厢是独立存在的,并且每节车厢都有上锁的车门,需要不同的钥匙才能解锁,假设在每次只能携带一把钥匙的情况下,想要从车头走向车尾,怎么安排钥匙?

最简单的做法:每节车厢里都放下一个车厢的钥匙。

 单链表的结构与火车类似:

        不过链表的每一个车厢称为节点,(车厢)节点内部存储有数据,以及下一个(车厢)节点的(钥匙)地址。

【C语言】图解链表的(2*2*2)八种类型_第3张图片

         图中指针变量plist保存的是第⼀个节点的地址,我们称plist此时“指向”第⼀个节点,如果我们希望plist“指向”第⼆个节点时,只需要修改plist保存的内容为0x0012FFA0。

 为什么还需要指针变量来保存下⼀个节点的位置?

         链表中每个节点都是独⽴申请的(即需要插⼊数据时才去申请⼀块节点的空间),我们需要通过指针变量来保存下⼀个节点位置才能从当前节点找到下⼀个节点。

         当我们想要保存⼀个整型数据时,实际是向操作系统申请了⼀块内存,这个内存不仅要保存整型数据,也需要保存下⼀个节点的地址(当下⼀个节点为空时保存的地址为空)。
当我们想要从第⼀个节点⾛到最后⼀个节点时,只需要在前⼀个节点拿上下⼀个节点的地址(下⼀个节点的钥匙)就可以了。

 链表的特点:

1、链式机构在逻辑上是连续的,在物理结构上不⼀定连续
2、节点⼀般是从堆上申请的
3、从堆上申请来的空间,是按照⼀定策略分配出来的,每次申请的空间可能连续,可能不连续

 (二)链表的八种分类

链表的结构⾮常多样,以下情况组合起来就有8种(2 x 2 x 2)链表结构:

 【C语言】图解链表的(2*2*2)八种类型_第4张图片

 对分类的理解:

 带头与不带头链表:

        带头链表是指在链表的开头增加一个额外的节点,该节点不存储具体的数据,仅用于辅助操作链表。带头链表的带头节点可以简化链表的操作,提高代码的可读性和可维护性。

        意义:

        带头节点可以避免链表为空的特殊情况处理。在没有带头节点的链表中,如果链表为空,添加、删除等操作都需要额外的处理逻辑。而带头节点的链表中,带头节点一直存在,无论链表是否为空,操作逻辑都是一致的,可以减少代码的复杂性。

        局限:

        造成额外的空间浪费。

单向与双向链表:

        相比于单向链表,双向链表的优点是在某些情况下可以更方便地进行插入、删除、查找等操作,因为它可以在任意位置访问前一个或后一个节点。但双向链表相对于单向链表需要更多的存储空间,因为每个节点需要额外的一个指针指向前一个节点。

循环与不循环链表:

        循环链表相比于不循环链表的优势在于某些操作的实现更加方便,例如在链表中插入一个节点时可以快速找到合适的位置,而不需要遍历整个链表。另外,循环链表可以通过一个节点的指针定位到任何其他节点,可以实现高效的旋转、反转等操作。

 

 根据上图,分类链表的结构如下:

(1)单向不带头不循环  &&  单向带头不循环

【C语言】图解链表的(2*2*2)八种类型_第5张图片

 两者的差别只有是否有头节点;

 (2)单向不带头循环  && 单向带头循环

【C语言】图解链表的(2*2*2)八种类型_第6张图片

 两者的差别只有是否有头节点; 

(3) 双向不带头不循环  &&  双向带头不循环

【C语言】图解链表的(2*2*2)八种类型_第7张图片

  两者的差别只有是否有头节点; 

(4) 双向不带头循环  &&  双向带头循环

【C语言】图解链表的(2*2*2)八种类型_第8张图片

   两者的差别只有是否有头节点; 


  虽然有这么多的链表的结构,但是我们实际中最常用还是两种结构:单链表和双向带头循环链表

        

  1. 无头单向非循环链表:结构简单,⼀般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。
  2. 带头双向循环链表:结构最复杂,⼀般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了。

        在下一节我们就来实现单链表和双向链表。 


完~

未经作者同意禁止转载

 

你可能感兴趣的:(数据结构,开发语言,数据结构)