Bootstrap

【数据结构】线性表

目录

线性表的定义及特点

线性表的特点

线性数据结构的特点

线性表的定义

顺序表

定义和初始化操作

存储方式

初始化操作 

其他操作

查找

插入

删除 

应用(合并操作)

集合的合并操作

两个顺序表的合并操作 

链表

单链表 

定义及存储表示

其他操作 

创建

前插法

后插法 

查找

插入 

删除  

循环链表 

双向链表

应用

集合的并操作(单链表)

 两个有序单链表的合并

一元多项式的表示及相加

​编辑 


线性表的定义及特点

线性表的特点

1、存在唯一的一个被称为“第一个”的数据元素

2、存在唯一的一个被称为“最后一个”的数据元素

3、除第一个外,集合中的每个数据元素均且只有一个前驱

4、除最后一个外,集合中的每个元素均有且只有一个后继

注:所有节点都只有一个直接前驱和一个直接后继

线性数据结构的特点

1、只有一个首结点和尾结点

2、除首尾结点外,其他结点只有一个直接前驱和一个直接后继

3、逻辑关系是一对一的

线性表的定义

1、由n个类型相同的数据元素构成的有限序列,记作 a1, a2, ... , an

2、其中1, 2, ……, n是元素的序号,表示元素在表中的位置

3、n为元素的总个数

4、a1, a2, ... , an 为数据元素

5、a1 表示线性起点,an 表示线性终点

6、ai-1是 a_i 的直接前驱,ai+1 是 ai 的直接后继

7、当n等于0时,称为空表

线性表的特点如下:

        1. 同一性 —— 线性表由同类数据元素组成

        2. 有限性 —— 由有限个数据元素组成

        3. 有序性 —— 线性表中的数据有先后顺序

顺序表

定义和初始化操作

存储方式

1. 顺序表:用顺序方式存储的线性表。在这种存储方式中,线性表的元素在内存中是连续存放的,每个元素都有一个固定的存储位置。

2. 链表:用链式方式存储的线性表。在这种存储方式中,线性表的元素在内存中不必是连续的,每个元素由一个节点表示,节点中包含数据元素和指向下一个节点的指针。链表可以是单向链表,也可以是双向链表或循环链表。

顺序存储:用一组地址连续的存储单元依次存储表中的元素,元素之间的相邻关系通过存储单元之间的邻接关系来体现

初始化操作 

定义完结构体类型SqList之后就开辟了一个空间,但此时 length 和 elem 里面都是垃圾数据,所以调用Initlist()函数,使得 elem 指向一个有效数组的首地址,length存放表的长度

 顺序表初始化操作

 单变量空间的申请

 数组空间的申请

 一维数组开辟以及赋值

其他操作

查找

基本思想:

将给定的元素 e 和顺序表中的每个元素依次进行比较,若找到与 e 相等的元素,则查找成功,返回其在表中的“位序”值,若找遍整个顺序表,都没有找到与 e 相等的元素,则查找失败,返回值 0

插入

思路(平均时间复杂度 O( n ) ):

1、判断插入位置 i 是否合法(1 <= i <= n+1 )

2、判断顺序表的存储空间是否已满,若满则返回EEROR

3、将第 k 个位置的元素依次向后移动一个位置,空出第 i 个位置

4、将要插入的新元素放入第 i 个位置,表长加1

删除 

思路:

1、判断删除位置 i 是否合法( i <= i <= n),若不合法则返回ERROR

2、将第 i+1 个至第 k 个元素依次向前移动一个位置(i = n时无需移动),表长加1

 

应用(合并操作)

集合的合并操作

 思路:假设集合A、集合B对应的分别为la表和lb表,再定义一个空表lc存放合并后的元素

1、将 la 的元素拷贝到 lc 表中

2、对 lb 中的元素逐个扫描,定位该元素在 la 表中的位置

3、若该元素不在 la 表中,则插入,若插入成功则 lc 表长增加

两个顺序表的合并操作 

思路参考双指针算法,此处就不过多赘述 

链表

 顺序表的优点:

1、逻辑上相邻的两个元素在物理位置上也相邻

2、可随机存取

3、它的存储位置可用一个简单直观的公式来表示

顺序表的缺点:

1. 需预分较大空间

2. 插入、删除需移动大量元素

3. 表的容量难以扩充

链表的特点:

1、用链式方式存储的线性表(线性表中的元素不是连续存储的,而是通过指针(或引用)连接起来的。每个元素包含数据部分和指向下一个元素的指针)

2、用一组任意的存储单元来存储线性表中的数据元素

 用一组任意的存储单元来存储线性表中的数据元素:(不需要像数组那样在内存中占据连续的空间)


 

单链表 

定义及存储表示

定义:

1、链式存储的线性表:由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针。

2、每个结点中只含有一个指针域:每个节点(结点)包含一个指针,这个指针指向列表中的下一个节点(双向链表的节点包含两个指针,分别指向前一个和后一个节点)

3、最后一个结点没有后继,它的指针域为空:链表的最后一个节点的指针域被设置为 `NULL`,表示链表的结束

4、设置一个表头指针head(H),指向链表的第一个结点


 

 概念(单链表是一种非随机存取结构):

1、首结点:这是链表中用于存储第一个数据元素的节点

2、头结点:这是在链表的首结点之前附加的一个节点(头结点通常不存储实际的数据)

3、头结点的作用:将对第一个节点的处理与对其他节点的处理统一起来(提供一个统一的起始点)

4、头指针:这是指向单链表第一个节点(通常是头结点)的指针

5、头指针变量:这是一个变量,其值是指向单链表第一个节点的指针

6、头指针变量的作用:标识单链表,是链表的入口点

定义方式:
 

其他操作 

创建

单链表的创建特点:

1、整个可用存储空间可为多个链表共同享用

2、链表占用的空间由系统根据需求即时生成

3、该过程是一个动态生成链表的过程(从一个空表出发,不断往其插入元素的过程)

前插法

每次都将新结点作为链表的第一个结点而插入,即始终插入到链表的第一个结点前

1、首先创建一个只含表头结点的空表

 2、输入一个新元素 x,申请一个结点空间 s用于存放 x 的值,再把 s 结点作为链表的第一个结点而插入

插入N个元素的总代码:

 

后插法 

每次都将新结点作为表尾结点插入,即始终插入到链表的最后一个结点之后

1、创建一个只含头节点的空表,指针R指向尾结点,初始时将R或air都指向表头结点,每输入一个新元素x,就给他申请一个节点空间S,将S插入结点R之后,再移动指针R指向新的尾结点

完整算法描述 

查找

1、按序号查找

2、按元素值查找 (返回指向LNode类型的指针)

对于定义ElemType类型的值x,理解为需要改变值最后实现带回时就使用引用(&x),否则直接定义x就行

插入 

删除  

循环链表 

定义:链表最后一个结点指针域的值不再是空(^),而是指向头结点,从而使链表构成一个环状

特点:从表中任意节点出发均可找到表中其他结点,提高查找效率 

 设置头指针

 设置尾指针  

在循环链表中,设置尾指针而不设置头指针可简化某些操作

双向链表

 

存储结构 :

应用

集合的并操作(单链表)

思路:

把B表的每个元素取出来,在A表中做一次定位查找,如果它不在A表,就插入

 

 两个有序单链表的合并

一元多项式的表示及相加

 

 

 

;