应用程序中数据主要有四种基本的逻辑结构:
(1) 集合:数据元素之间只有“同属于一个集合”的关系。
(2) 线性结构:数据元素之间存在一个对一个的关系。
(3) 树形结构:数据元素之间存在一个对多个的关系。
(4) 图状结构或网状结构:数据元素之间存在多个对多个的关系。
对于数据不同的逻辑结构,底层通常有两种物理存储结构:
(1) 顺序存储结构;
(2) 链式存储结构。
1、线性表:
线性表(Linear List)是由n(n>=0)个数据元素(节点)组成的有限序列。
线性表中每个元素必须具有相同的结构(即拥有相同的数据项)。线性表是线性结构中最常用而又最简单的数据结构。线性表中数据元素不是数据值,一个数据元素可以包含多个数据项。
如:在员工信息表中,一个数据元素可以包含员工编号、员工姓名、员工年龄、员工学历等等。
2、线性表顺序存储结构
顺序存储结构是指用一组地址连续的存储单元依次存放线性表中的元素。顺序结构线性表底层采用数组来存储数据元素。需要预先知道数据大小。
顺序表中每个元素都可随机存取,顺序存储的线性表是一种随机的存储结构。
3、线性表链式存储结构
链式存储结构是指用一组地址任意的存储单元存放线性表中的元素。链式存储结构的线性表不会线性逻辑来存储数据元素,它在每一个数据元素里保存一个指向下一个数据元素的引用(指针)。
链表在插入、删除数据元素时比顺序线性表快得多,但是查找一个节点或访问特定编号的节点则花费时间多。链表由于增加了节点的指针域,空间开销大。
3.1、单链表
动态建立单链表有两种方式:头插法建表和尾插法建表。
头插法建表:将数据元素存入节点的data域中,然后不断地以新节点为头节点,让新节点指向原有的头节点。
尾插法建表:将新节点插入链表的表尾,需要为链表定义一个引用变量来保存链表的最后一个节点。
头插法建表较简单,生成的链表中节点的次序和输入的顺序相反;尾插法建表稍复杂,但节点次序和输入顺序相同。
3.2、循环链表
将单链表的尾节点next指针改为引用单链表header节点,形成首尾相接的链表。
循环链表从任一节点出发均可找到表中的其他所有节点。
3.3、双向链表
双向链表具有对称性,每个节点既可以向前引用,也可以向后引用,指针具有双向性,更方便地插入、删除数据元素。
4、线性表分析
4.1、实现分析
顺序表 | 链表 | |
空间性能 | 存储空间静态分布,需要一个长度固定的数组,总有部分数组元素浪费 | 存储空间动态分布,空间不会被浪费,链表需要额外的空间来为每个节点保存指针,需牺牲部分空间 |
时间性能 | 元素的逻辑顺序与存储顺序一致,支持随机存取,在查找、读取时性能很好 | 插入、删除元素时性能较好 |
LinkedList是双向链表。