数据结构之线性存储结构

 转自:http://segmentfault.com/a/1190000002471232

  昨天和同事们聚餐,说到链表,由于对数据结构的不了解(在学校的时候看过一点,现在早忘了),直接丢人现眼了。意识到自己的不足,所以赶紧充充电。

  再了解链表之前,先来了解线性表的存储结构:其主要分为两类,一、顺序存储结构——顺序表;二、链式存储结构——链表。

  通过两者的对比表格,我们能够更加清楚的了解顺序表链式表的特点:

顺序存储结构——顺序表

1、可以随机访问。

2、占用连续空间,存储分配只能预先进行,即静态分配。

  一旦分配好了,在对其操作过程中不变。

3、插入操作需要移动多个元素。

链式存储结构——链表

1、不可以随机访问。

2、不需要占用连续空间,动态分配。即在要创建新结点的

  时候再进行空间划分。

3、插入操作不需要移动多个元素。

4、每个结点划一部分空间存储指向下一结点位置的指针,

  故存储空间利用率比顺序表稍低

  接下来分别了解5种形式的链表:

  1、单链表

  头结点可带、可不带。

  不带头结点的,head指针则指向开始结点,当head为null时,链表为空。

  带头结点的,head指针始终不为空。head ->头节点 next 为null时,链表为空。

  头结点不存储信息,只是作为标记

  

  2、双链表

  双链表就是在单链表结点上增添了一个指针域,指向当前结点的前驱。这样就可以方便的由其后继来找到其前驱,而实现输出终端结点到开始结点的数据序列。

  同样,双链表也分为带头结点的双链表和不带头结点的双链表,情况类似于单链表。带头结点的双链表 head->next 为null
的时候链表为空。不带头结点的双链表head为null的时候链表为空。

  3、循环单链表

  只要将单链表的最后一个指针域(空指针)指向链表中第一个结点即可(这里之所以说第一个结点而不说是头结点是因为,如果循环单链表是带头结点的则最后一个结点的指针域要指向头结点;如果循环单链表不带头结点,则最后一个指针域要指向开始结点)。

  带头结点的循环单链表当head等于head->next时链表为空;
  不带头结点的循环单链表当head等于null时链表为空。

  4、循环双链表

  

  循环双链表的构造源自双链表,即将终端结点的next指针指向链表中第一个结点,将链表中第一个结点的prior指针指向终端结点。

  带头结点的循环双链表当head->next和heaad->prior两个指针都等于head时链表为空。
  不带头结点的循环双链表当head等于null的时候为空。

  5、静态链表

  这种链表借助一维数组来表示,例如:

原文地址:https://www.cnblogs.com/hcw136156133/p/5043164.html