温习数据结构的基本框架:
![](https://img-blog.csdnimg.cn/img_convert/ad3a49beeda80f9b16d39936a0a585da.png)
线性表:具有相同特性的数据元素(结点)的一个有限序列。
将非空的线性表记作:(a1,a2, ......, an); 对于不同的线性表,an所代表的含义也不同,但元素之间一定是线性关系,且开始结点和终端结点分别仅有一个,其中的内部结点一定有且仅有一个确定的前趋和后继。
![](https://img-blog.csdnimg.cn/img_convert/387e2dfae940d65d55a6b531f220ab6a.png)
案列引入:
一元多项式的运算
稀疏多项式的运算:用链表更适合
图书信息管理系统
线性表的抽象数据类型的定义&基本操作举例:
![](https://img-blog.csdnimg.cn/img_convert/e08530e98b1e8e2fede02b86dd7a7563.png)
![](https://img-blog.csdnimg.cn/img_convert/7594376e5f484c1b7564c3d834e63b12.png)
![](https://img-blog.csdnimg.cn/img_convert/53840721447e8eb915ae520617ca930c.png)
![](https://img-blog.csdnimg.cn/img_convert/5623d07ec0485ca8a8ecaa7137c8e16e.png)
![](https://img-blog.csdnimg.cn/img_convert/550ca85fa394b7dfbadc776d315ad390.png)
![](https://img-blog.csdnimg.cn/img_convert/98617776a582b9d12bbef15a5a8f3669.png)
![](https://img-blog.csdnimg.cn/img_convert/f87a0a4637afddfd37adb7ab716fe6c9.png)
(traverse意思是遍历,遍历并不知道对每个元素需要进行哪方面的操作)
线性表的顺序表现和实现:
顺序存储:逻辑上相邻的元素在物理存储位置上也是相邻的;在存储时还要保证依次存储,地址连续,及中间没有空出存储单元。其中起始结点的地址称为基地址。
优点:存储密度大/可以随机存取任一元素;
缺点:插入或删除时时间效率很低/可能会浪费存储空间/静态存储,元素个数不能自由扩充。
1)元素存储位置的计算:
![](https://img-blog.csdnimg.cn/img_convert/822357c390806de370ebc24e3f771bb2.png)
优点:只要确定了基地址,其他任何数据元素的地址都是已知的,即是一种随机存取的存储结构。
2)用动态分配的一维数组描述顺序存储结构:(直接映射过去)
由于数组的长度不可动态定义,而线性表长度可变,最大存储空间不定,故而需要动态分配的一维数组:
可以理解为定义一个很大的数组,但只用一部分,用的那部分标注出来。
![](https://img-blog.csdnimg.cn/img_convert/fa5533fbc205f7158e3a662bf045039d.png)
其中ElemType表示数组存储的是什么类型的变量,通常就是自己定义的结构体名;
elem[]也常写为*elem,故而实际上是以下两种:
![](https://img-blog.csdnimg.cn/img_convert/f63991d1d82d16407d0d161354b1ddff.png)
注意逻辑顺序和物理位序下标是差1的,因为数组的第一个元素的下标是0。
3)顺序表示意图:
![](https://img-blog.csdnimg.cn/img_convert/2f716378fd3c0b8b6825e8bc9866e8de.png)
分为绿色部分和蓝色部分,绿色部分进行增添删除插入等等时蓝色跟着改变,即本质还是一个结构体。
4)顺序表基本操作的算法实现:
![](https://img-blog.csdnimg.cn/img_convert/7d6e5c39f8ef94fea4ac0b18e76e9335.png)
![](https://img-blog.csdnimg.cn/img_convert/62bb88f74c3184cf19dcfceb7cdd495f.png)
status常是返回值类型;elemtype常是元素类型。
线性表的初始化:
![](https://img-blog.csdnimg.cn/img_convert/16ac16174615c7127fac66573ae88f86.png)
2.销毁线性表L,即将L从内存空间里删除:
![](https://img-blog.csdnimg.cn/img_convert/d79e75c7731435161643d263d50532f9.png)
3.清空线性表L,即只将L中的内容清空,L依然在内存里:
![](https://img-blog.csdnimg.cn/img_convert/de355a6f2086e58dbceb76cad59b5414.png)
4.求线性表L的长度:
![](https://img-blog.csdnimg.cn/img_convert/43aef1c8768ff0c069bbfa5c8d964499.png)
5.判断线性表L是否为空:
![](https://img-blog.csdnimg.cn/img_convert/5177c9b97631bb5c67a44544d12e30fb.png)
6.顺序表的取值(通过位置i来获得相应位置的数据元素的内容,赋给e并返回):
![](https://img-blog.csdnimg.cn/img_convert/cdb585c3b38412990afcd1f2974aa31a.png)
该算法体现了顺序结构最大的优点:随机存取
7.顺序表的查找:按值查找,即确定某个值存不存在,存在返回序号,不存在返回0
![](https://img-blog.csdnimg.cn/img_convert/6127b50a7267d19c4e5c06c1bcb32a9d.png)
平均查找长度ASL(Average.Search Length):
为确定记录在表中的位置,需要与给定值进行比较的关键字的个数的期望值。
![](https://img-blog.csdnimg.cn/img_convert/df1ad62114bcaae8db4cb6106fa7cede.png)
即查找算法的平均时间复杂度为O(n),平均空间复杂度为S(1)。
8.顺序表的插入:插入位置在最后/中间/最前:n个元素中,有n+1个能插入的位置;
异常处理:1.插入位置不合法(不在1~n+1的范围内) 2.插入溢出(length的值是否等于数组最大值);
往最后插最简单;往中间插入时,意思就是把原本的元素赋值给后一个位置里,从后往前后移,直至空出插入位置;而插入最前面时就是从后往前全体后移,空出第一个;
记得每插入一个元素,顺序表的长度就会加1,需要在L.length上体现(值也加1)。
![](https://img-blog.csdnimg.cn/img_convert/50a538b96d33e364ba8cf207caaba13e.png)
![](https://img-blog.csdnimg.cn/img_convert/4373938b1fc0a9bd5eda6ee8ded492dd.png)
![](https://img-blog.csdnimg.cn/img_convert/a7be29ccf4b52d774a1f93e8b17229c4.png)
即插入算法的平均时间复杂度为O(n),平均空间复杂度为S(1)。
9.顺序表的删除:返回的是要删除元素的值;删除位置在最后/中间/最前;
异常处理:删除位置必须合法(1~n);
类似于插入,先删除使其位置变空,再将之后的元素从前到后依次前移,即后面的元素值赋给前面的;
记得每删除一个元素,顺序表的长度就会减1,需要在L.length上体现(值也减1)。
![](https://img-blog.csdnimg.cn/img_convert/d9110406a7c19f087bacd8b873514fcb.png)
![](https://img-blog.csdnimg.cn/img_convert/768fe1bd42c14042a9f5c0f0066cd818.png)
![](https://img-blog.csdnimg.cn/img_convert/f6f975d3b26d5cb0c4e72d2b0a812896.png)
即删除算法的平均时间复杂度为O(n),平均空间复杂度为S(1)。