![e03dd70bf4518951a1553cc5081fdaaa.png](https://i-blog.csdnimg.cn/blog_migrate/d890d9d25b1d26d3365daaed13613e5d.jpeg)
数据结构 ——线性表的原理及c++程序实现
什么是线性表?
线性表:由同类型数据元素构成有序序列的线性结构
>表中元素个数称为线性表的长度
>线性表没有元素时,称为空表
>表起始位置称表头,表结束位置称表尾
线性表的抽象数据类型描述
类型名称:线性表(List)
数据对象集:线性表是 n (≥0)个元素构成的有序序列( a1, a2, …,an )
操作集:线性表L ∈ List,整数i表示位置,元素X ∈ ElementType,
线性表基本操作主要有:
1、List MakeEmpty():初始化一个空线性表L;
2、ElementType FindKth( int K, List L ):根据位序K,返回相应元素 ;
3、int Find( ElementType X, List L ):在线性表L中查找X的第一次出现位置;
4、void Insert( ElementType X, int i, List L):在位序i前插入一个新元素X;
5、void Delete( int i, List L ):删除指定位序i的元素;
6、int Length( List L ):返回线性表L的长度n。
线性表的顺序存储实现:
利用数组的连续存储空间顺序存放线性表的各元素
![3d378fecafd7491685d78a92edd52e58.png](https://i-blog.csdnimg.cn/blog_migrate/15b1c3e3cd69ae310a54f5e4ec5db03b.png)
定义线性表的数据对象集
![aeb68e5f9c9e998c87d180fe43dab79d.png](https://i-blog.csdnimg.cn/blog_migrate/804c5b28aa7cd7202ce51822d7ba47ca.png)
定义线性表的操作集
初始化空表:
![9ac40afb1d0fdafc4ca0ff2a00a3801c.png](https://i-blog.csdnimg.cn/blog_migrate/d80deafe32ed2ff0a85f8dd2f5f75680.png)
查找线性表中的元素
![04b81efc3a0ada0c84db15a547cd15d5.png](https://i-blog.csdnimg.cn/blog_migrate/9a705809eb7acb697b93bd7c803d8f30.png)
向线性表中插入元素
![3a7365a5562ec8f558783828fb288cf2.png](https://i-blog.csdnimg.cn/blog_migrate/a3b2bcf311c3c84329b500d5cf87495a.png)
PS:相较于老师在视频中写的插入操作,我自己增加了插入到线性表尾的操作,可以用来初始化线性表
删除线性表中的元素
![0bb24154f957585db9825e715c114309.png](https://i-blog.csdnimg.cn/blog_migrate/cd5407223c1f27d42ddf4083b97e1741.png)
线性表的完整代码如下
![515f61c63720315250f17ba86d387ef2.png](https://i-blog.csdnimg.cn/blog_migrate/28846393cb6e1b28c96d5b32b149513c.jpeg)
线性表的链式存储实现:
不要求逻辑上相邻的两个元素物理上也相邻;通过“链”建立起数据元素之间的逻辑关系
>插入,删除不需要移动数据元素,只需要修改“链”
![2f3f3b7587be3cf6fe0a44030da70fe6.png](https://i-blog.csdnimg.cn/blog_migrate/363b630a034aee6c83fcc0d95b3e860b.png)
定义链表的数据对象集
![4937cf96c939e5b7dd3b0b6016214433.png](https://i-blog.csdnimg.cn/blog_migrate/6f56386fbbd9aa88f659e97f688aead9.png)
链表的每一个结点都代表一个结构,一个结构至少有两个分量,一个分量代表这个结点对应的数据,另一个代表它的下一个结点的位置
定义链表的操作集
查表长
![9a037cfedafafbb1fa052f6cde55e5d5.png](https://i-blog.csdnimg.cn/blog_migrate/4039ba6d2973e805d26c5b9195a901ff.png)
首先将指针指向链表表头,计数器定为0,将指针依次后移直到指向空指针,计数器依次+1
按序号查找
![282a847321149e7540d6bc7a0c87e73c.png](https://i-blog.csdnimg.cn/blog_migrate/38f6145ded344b30484f493e89e172d2.png)
链表寻找元素不同于顺序表,顺序表逻辑相邻的元素顺序也相邻,故数组下标+1即可指向下一元素,知道逻辑位置即可知道物理位置,链表依靠指针NEXT连接在一起,如果想要知道某逻辑位置的值必须依靠指针从头依次遍历找到其物理位置,返回物理位置。
按值查找
![6fd009330b29352c4c090d959aff558e.png](https://i-blog.csdnimg.cn/blog_migrate/eea708bf0edb00e40a67769d341cfecb.png)
链表的插入
![fde023f4f3389b9cb8f0b1f880936e20.png](https://i-blog.csdnimg.cn/blog_migrate/fa18d7f4907647d3716b82594e976520.png)
![7275aa799f55ec5358dae402895122cc.png](https://i-blog.csdnimg.cn/blog_migrate/c64c94c941df38ae1821f2caeea5a978.png)
链表删除
![0b86ac27323751cb3392e731b3944e54.png](https://i-blog.csdnimg.cn/blog_migrate/e14bbd258302a4ae51f864fd7fbae474.jpeg)
![06c267536855e613bb125d7a1069698d.png](https://i-blog.csdnimg.cn/blog_migrate/37e8922dd868186727a191932e4182de.png)
由于链表中的每一个结点都是通过new函数申请得到的,故删除以后为防止内存泄露需要将其delete掉。
删除头结点有两种情况,一种头结点本身为空,此时返回NULL即可,一种是头结点本身不空,则将一个指针指向要被删除的结点,将头结点后移一位,然后删除指针所指向的结点,此时表空
完整代码
![fc1adc0fe3f11f2bbfd93930b88e4e9c.png](https://i-blog.csdnimg.cn/blog_migrate/a792799c1358aaca5f6ad6479093c5b1.jpeg)
注:本次笔记基于浙江大学陈越以及何钦明老师的数据结构课,其中加入了自己的理解,如果有不正确的地方欢迎大家在评论区留言,不胜感激。