一、线性表的基本概念
1.线性表的定义
线性表是一个具有相同特性的数据元素的有限序列。
- 相同特性:所有元素属于同一数据类型。
- 有限:数据元素个数有限。
- 序列:数据元素由逻辑序号唯一确定。一个线性表中可以有相同值的元素。
线性表中所有元素的个数叫做线性表的长度,用n表示,n大于等于0。n等于0时,表示线性表是一个空表,即不包含任何元素。
2.线性表的运算
线性表的9个基本运算如下:
- 初始化线性表InitList(&L):构造一个空的线性表L。
- 销毁线性表DestroyList(&L):释放线性表L占用的内存空间。
- 判线性表是否为空表ListEmpty(L):若L为空表,则返回真,否则返回假。
- 求线性表的长度ListLength(L):返回L中元素个数n。
- 输出线性表DispLIst(L):线性表L
不为空时,顺序显示L中各节点的值域。 - 求线性表L中指定位置的某个数据元素GetElem(L,i,&e):用e返回L中第i(i<=i<=n)个元素的值。
- 定位查找LocateElem(L,e):返回L中第一个值域与e相等的逻辑位序。若这样的元素不存在,则返回值为0。
- 插入一个数据元素ListInsert(&L,i,e):在L的第i个蒜素之前插入新的元素e,L的长度增1。
- 删除数据元素ListDelete(&L,i,&e):删除L的第i个元素,并用e返回其值,L的长度减1。
线性表存储结构:顺序存储结构和连式存储结构
二、线性表的顺序存储结构
线性表的顺序存储结构:把线性表中的所有元素按照书序存储方法进行存储。按逻辑顺序依次存储到存储器中一片连续的存储空间中。
优点:
- 存储密度大:无需为表示线性表中元素之间的逻辑关系而额外增加存储空间。
- 具有随机存取特性
缺点:
- 插入和删除操作需要大量移动元素
- 初始化空间大小分配难以掌握
三、线性表的链式存储结构
线性表中的每个节点有唯一的前趋节点和后继节点。
设计链式存储结构时,每个逻辑节点存储单独存储,为了表示逻辑关系,增加指针域。
- 每个物理节点增加一个指向后继节点的指针域=>单链表。
- 每个物理节点增加一个指向后继节点的指针域和一个指向前趋节点的指针域=>双链表。
单链表增加一个头结点的优点如下:
- 第一个节点的操作和表中其他节点的操作一致,无需特殊处理。
- 无论链表是否为空,都有一个头结点,因此空表和飞控表的处理也就统一了。
存储密度是指节点数据本身所占的存储量和整个节点结构中所占的存储量之比。
一般的,存储密度越大,存储空间的利用率就越高。显然,顺序表的存储密度为1,而链表的存储密度小于1。
优点:
- 由于采用节点的动态分配方式,具有良好的适应性。
- 插入和删除操作只需修改相关指针域,不需要移动元素。
缺点:
- 存储密度小:为表示线性表中元素之间的逻辑关系需要额外增加存储空间。
- 不具有随机存取特性。
1.单链表
特点:当访问过一个节点后,只能接着访问它的后继节点,而无法访问它的前趋节点。
①插入节点和删除节点操作
- 插入节点
插入操作:将值为x的新节点*s插入到*p节点之后。
特点:只需修改相关节点的指针域,不需要移动节点。
- 删除节点
删除操作:删除*p节点之后的一个节点。
特点:只需要修改相关节点的指针域,不需要移动节点。
②建立单链表
建立单链表的常用方法有两种:
- 头插法建表
- 从一个空表开始,创建一个头结点。
- 依次读取字符串数组a中的元素,生成新节点。
- 将新节点插入到当前链表的表头上,直到结束为止。
注:链表的节点顺序与逻辑次数相反。
- 尾插法建表
- 从一个空表开始,创建一个头结点。
- 依次读取字符串数组a中的元素,生成新节点。
- 将新节点插入到当前链表的表尾上,直到结束为止。
注:链表的节点顺序与逻辑次数相同。
2.双链表
在线性表的链式存储结构中,每个物理节点增加一个指向后继节点的指针域和一个指向前趋节点的指针域=>双链表。
已知某个节点的地址,删除它的时间为O(1)。
双链表的优点:
- 从任一节点出发可以快速找到其他前趋节点和后继节点
- 从任一节点出发可以访问其他节点
- 存储密度通常地域单链表
①双链表中节点的插入和删除
![1198226-9bc94271991353d1.png](https://i-blog.csdnimg.cn/blog_migrate/762065a35fd4bffb977c5d62929392e1.webp?x-image-process=image/format,png)
![1198226-1f342f2a7ff8cf50.png](https://i-blog.csdnimg.cn/blog_migrate/3ea354b78edcc1008822baf677d4127e.webp?x-image-process=image/format,png)
②建立双链表
建立双链表也有两种方法:头插法和尾插法。与单链表算法相似,主要是插入和删除的不同。
3.循环列表
循环链表是另一种形式的链式存储结构形式。![1198226-bf198d1c2e5d4954.png](https://i-blog.csdnimg.cn/blog_migrate/9ae912b968a3551f90c7b49762bcdb67.webp?x-image-process=image/format,png)
循环单链表
![1198226-7d0599bc24e8374a.png](https://i-blog.csdnimg.cn/blog_migrate/2cbbafa62dff3a11cd165ab1614572e2.webp?x-image-process=image/format,png)
与非循环单链表相比,循环单链表:
- 链表中没有空指针域
- p所指节点为尾节点的条件:p->next=L
![1198226-8f5a08808235dc06.png](https://i-blog.csdnimg.cn/blog_migrate/14dc7c45034cf2d4effae75694c00fa3.webp?x-image-process=image/format,png)
循环双链表
![1198226-6cb6bd4a6b1fd202.png](https://i-blog.csdnimg.cn/blog_migrate/20ee8da72860dfec9ab90e5159a12988.webp?x-image-process=image/format,png)
![1198226-cc2f727f1ad78fa8.png](https://i-blog.csdnimg.cn/blog_migrate/d9cdd70f7f11c8f3c7dca3bdcda8d27a.webp?x-image-process=image/format,png)
四、有序表
1.什么是有序表
所谓有序表,是指这样的线性表,其中所有元素以递增或递减方式有序排列。有序表和线性表中元素的逻辑关系相同,其区别是运算实现的不同。所以有序表可以采用与线性表相同的数据存储结构:顺序表和链表。
若以顺序表存储有序表,基本运算算法中还有ListInsert()算法与前面的顺序表对应的运算有所差异,其余都是相同的。
若以链表存储有序表,同样也只有ListInsert()算法有所差异,其余都是相同的。