线性表
1.线性表的基本概念
- 定义
- 特点
2.线性表的顺序表示和实现
- 线性表的顺序表示
- 顺序表中基本操作的实现
3.线性表的链式表示和实现
- 线性表的链式表示(单链表)
- 单链表的基本操作的实现
- 循环链表
- 双向链表
4.顺序表和链表的比较
- 空间性能比较
- 时间性能比较
5.线性表的合并
- 顺序有序表的合并
- 链式有序表的合并
1.1线性表的定义
由n个数据特征相同的元素构成的有序序列
1.2线性表的特点
存在唯一一个被称为“第一个”和“最后一个”的数据元素
除第一个元素外,结构中每个数据元素均只有一个前驱
除最后一个元素外,结构中每个数据元素均只有一个后驱
🔴C语言中可用动态分配的一维数组表示线性表
2.1线性表的顺序表示
指用一组地址连续的储存单元依次储存线性表的数据元素
(在逻辑上相邻的两个数据元素在存储的物理位置也相邻)
🔴随机存储的储存结构
每个节点=数据域
2.2顺序表中基本操作的实现
🔵操作时,需要判断i是否是合理的
2.2.3初始化(构造一个空的顺序表)
(动态分配一个预定义大小的数组空间)
2.2.4取值(根据指定的位置序号i,获取第i个数据元素的值)
可以直接取指定位置的值(数组下标)
2.2.5查找(根据指定的数据元素的值e,查找与e相等的第i个位置序号)
运用循环和判断语句,从第一个元素开始查找
2.2.6插入(在第i个位置插入一个新的数据元素e)
将i后面的元素依次向后移动一位,然后再插入新位置
2.2.7删除(将第i个位置的数据元素e删除)
将i+1后面的元素依次向前移动一位
3.1线性表的链式表示(单链表)
📘为了处理方便(首元节点,空表和非空表),在链表前的第一个节点之前附加一个节点,称为头节点。
指用一组任意的存储单元存储线性表的数据元素(该组的存储单元可连续可不连续)
(在逻辑上相邻的两个数据元素在存储的物理位置不要求相邻)
🔴顺序存储的储存结构(C语言中用结构指针来描述)
每个节点=数据域+指针域
头节点:是在首元节点前再设的一个新节点(方便处理数据)
首元节点:指链表中储存的第一个元素的节点
头指针:指向链表的第一个节点的指针(头节点/首元节点)
注意:由于单链表是由表头指针唯一确定的,所以单链表可以用头指针的名字来命名
3.2单链表的基本操作的实现
3.2.1初始化(构造一个空的链表)
(生成一个新节点作为头节点,用头指针L指向头节点。)
3.2.2取值(根据指定的位置序号i,获取第i个数据元素的值)
与顺序表不同,链表需要从首元节点出发,顺着链域逐个节点向下访问
3.2.3查找(根据指定的数据元素的值e,查找与e相等的第i个位置序号)
与顺序表类似,从首元节点出发,依次将节点值和给定值e比较
3.2.4插入(在第i个位置插入一个新的数据元素e)
生成一个新节点s储存数据元素,
先将s的指针域指向i节点,
再把i-1节点的指针域指向s节点
3.2.5删除(将第i个位置的数据元素e删除)
先生成一个新指针q指向i节点,
再把i-1节点的指针域直接指向i+1节点,
然后释放指针q指向的内容(i节点的元素e)
3.2.6创建单链表
与初始化不同,初始化操作只是创建一个只有头节点的空链表,而创建单链表是一种动态生成链表的过程(包含了若干个节点)
🔵前插法:(将新节点逐个插入链表的头部(头节点之后))
将A B C D逆位序输入数据
- 生成一个新节点并赋值
- 将新节点插入到头节点之后
🔵后插法:(将新节点逐个插入链表的尾部)
将A B C D顺位序输入数据
- 生成一个新节点并赋值
- 将新节点插入尾节点之后
- 把尾指针指向新的尾节点
需要创建一个尾指针(一开始尾指针与头指针都指向头节点)
3.3循环链表
特点:链表的最后一个节点的指针域指向头节点
3.4双向链表
特点:链表的节点中有两个指针域,一个指向后驱,一个指向前驱
🔷插入(在第i个位置之前插入元素e)
- 生成一个新节点s并赋值为e,
- 先将i-1节点的后驱指针指向s节点,
- 在将s节点的前驱指针指向i-1节点,
- 然后将i+1节点的前驱指针指向s节点,
- s的后驱指针指向i+1节点
🔷删除(删除第i个位置的元素)
- 先将i+1节点的前驱指针指向i-1节点,
- 再将i-1节点的后驱指针指向i+1节点,
- 然后删除i节点
4.1空间性能比较
存储密度(存储空间的利用率·):数据元素本身占用的储存量与整个节点结构所占的储存量之比
顺序表:
存储空间必须预先分配,容易造成储存空间浪费和空间溢出。元素个数有限制。
存储密度较大
链表:
存储空间不需要预先分配。元素个数无限制。
储存密度较小
4.2时间性能比较
顺序表:
取值操作效率高,插入与删除操作效率低
链表:
取值操作效率低,插入与删除操作效率高
5.1顺序有序表的合并(LA,LB的合并)
- 创建一个新的空表LC,
- 将指针pc指向LC第一个元素,将pa,pb分别指向LA,LB的第一个元素,
- 依次比较元素大小,将小的元素加入到LC表中,
- 如果有一方有序表已经到表尾,则将剩下一个有序表直接加入到LC表中。
5.2链式有序表的合并 (LA,LB的合并)
- 将LC的节点取值为LA/LB的头节点(不需要新建空表),
- 将pa,pb分别指向LA,LB的第一个节点,pc指向LC的头节点,
- 依次比较元素大小,将小的元素所对应的节点加入到LC表中,
- 如果有一方有序表已经到表尾,则将剩下一个有序表直接插入到pc所指的节点后。
- 然后释放LB/LA的头节点。
🔺不需要创建一个新的空表