线性表
概念
线性表是最基本、最简单、也是最常用的一种数据结构。线性表中的数据元素之间的关系式一对一的关系,即除了第一个和最后一个数据元素之外,其他数据元素都是首尾相接的。线性表的逻辑结构简单,便于实现和操作。因此,线性表这种数据结构在实际应用中时广泛采用的一种数据结构。
线性表示n个元素的有限序列,通常记为(a1,a2,a3,……,an),其特点如下:
存在唯一的一个称作“第一个”的元素;
存在唯一的一个称作“最后一个”的元素;
除了表头外,表中的每一个元素均只有唯一的直接前驱;
除了表尾外,表中的每一个元素均只有唯一的直接后继。
一、线性表的存储结构
1、顺序存储
线性表的顺序存储是一组地址连接的存储单元依次存储线性表中的数据元素,从而使得逻辑关系相邻的两个元素在物理位置上也相邻。在这种存储方式下,存储逻辑关系无须占用额外的存储空间。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
其优点是可以随机存取表中的元素,缺点是插入和删除操作需要移动大量的元素。
![](http://service.wiz.cn/wizkm/a/g?t=w&id=1jhqLu1T_kjD2zCpzy1URsbz&f=cfaf8118b873532181f02e7a81da4153.png)
顺序表插入一个结点,首先将其后面结点往后移动,然后在插入。
2、链式存储
在计算机中用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。
它不要求逻辑上相邻的元素在物理位置上也相邻。因此它没有顺序存储结构所具有的弱点,即插入和删除不需要移动元素;但它失去了顺序表可以随机存取的优点。
二、链表的类别
1、单链表
![](http://my.csdn.net/uploads/201204/30/1335792749_5797.png)
单链表的删除:
先将a1结点指向下一个结点a3,然后释放两者之间的a2。
单链表的插入:
如在a1和a2之间插入一个结点:先将要插入的结点p的next域指向a2,然后将a1结点的next域指向p结点。
2、循环链表
![](http://my.csdn.net/uploads/201204/30/1335792819_1714.png)
循环链表的删除和插入操作,同单链表。
3、双链表
![](http://my.csdn.net/uploads/201204/30/1335792805_5850.png)
双链表的删除:
![](http://my.csdn.net/uploads/201204/30/1335792812_5632.png)
双链表的插入:
![](http://my.csdn.net/uploads/201204/30/1335792797_9832.png)
链表的删除和插入原则就是:保证后面的结点不被丢失,所以先将next域指向它即可。
顺序表与链表的比较
![](http://my.csdn.net/uploads/201204/30/1335792781_6882.png)
三、栈
栈作为一种数据结构,是一种只能在一端进行插入和删除的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
栈可以用来在函数调用的时候存储断点,做递归时要用到栈!
![](http://my.csdn.net/uploads/201204/30/1335792830_6974.png)
栈既可以用链式来实现,也可以用顺序来实现。
四、队列
队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将最后被删除的元素,因此队列又称为“先进先出”(FIFO—first in first out)的线性表。
队列空的条件:front=rear
队列满的条件: rear = MAXSIZE
循环队列
![](http://my.csdn.net/uploads/201204/30/1335792825_8695.png)
tail+1=head成为判断队满的一个判断式。
线性表主要包括以上几个部分,总结出来和大家一起分享。