大话数据结构 线性表
《大话数据结构》 阅读整理
线性表
线性表的定义
零个或多个数据元素的有限序列
性质
一个数据元素可以由若干个数据项组成
举例
白羊->金牛->双子->巨蟹->狮子->处女->天秤->天蝎->射手->摩羯->水瓶->双鱼
前一个称为后一个的直接前驱
后一个称为前一个的直接后继
线性表的顺序存储结构
用一段地址连续的存储单元依次存储线性表的数据元素
存储器中每个存储单元都有自己的编号 这个编号称为地址
1 | //将int 用 ElemType替代了 |
线性表的操作
获取元素操作
- 思路
检验要查找的元素位置是否符合
直接找到返回即可
1 | //获取元素操作 e返回L中第i个数据元素的值 i指的是位置 所以下标得 - 1 |
插入操作
- 思路
插入位置不合理 抛出异常
线性表长度大于等于数组长度 抛出异常或动态加容量
从最后一个元素开始向前遍历到第i个位置 分别向后移动一个位置
插入元素到指定位置
表长 + 1
1 | //插入元素操作 在L中第i个位置之前插入新的元素e L长度 + 1 |
删除操作
- 思路
删除位置不合理 抛出异常
取出删除元素
删除元素位置开始遍历到最后一个元素位置 分别将他们向前移动一个位置
表长 - 1
1 | //删除元素操作 删除L的第i个元素 用e返回值 线性表长度 - 1 |
线性表顺序存储结构的优缺点
- 优点
无需为表示表中元素之间的逻辑关系而增加额外的存储空间
可以快速地存取表中任一位置的元素
- 缺点
插入和删除操作需要移动大量元素
当线性表长度变化较大时 难以确定存储空间的容量
造成存储空间的碎片
线性表的链式存储结构
线性表链式存储结构定义
数据域
存储数据元素信息
指针域
存储直接后继位置
指针/链
指针域中存储的信息
结点
数据源 + 指针域
单链表
每个结点中只包含一个指针域
头指针
链表中第一个结点的存储位置
头结点
单链表的第一个结点前附设一个结点
n个结点链接成一个链表 即为线性表的链式存储结构
头指针与头结点的异同
- 头指针
链表指向第一个结点的指针 若链表有头结点 则是指向头结点的指针
头指针具有标志作用 所以常用头指针冠以链表的名字
无论链表是否为空 头指针均不为空 头指针是链表的必要元素
- 头结点
为了操作的统一和方便而设立的 放在第一元素的结点之前 其数据域一般无意义
对在第一元素结点前插入节点和删除第一结点 其操作与其他结点的操作就统一了
不一定是链表的必需要素
线性表链式存储结构
结点由存放数据元素的数据域和存放后地址的指针域组成
1 | //类型替换 |
单链表的操作
单链表的读取
- 思路
声明一个指针p指向链表第一个结点 初始化j从1开始
当j<i 时 遍历链表 让p指针后移 j累加
若到链表末尾p为空 说明第i个结点不存在
查找成功 返回结点p的数据
1 | //单链表的读取 |
单链表的插入
- 思路
声明一指针p指向链表的头结点 初始化j从1开始
当j<i 时 遍历链表 让p指针后移 j累加
若到链表末尾p为空 则说明i个结点不存在
查找成功 在系统中生成一个空结点s
将数据e赋值给s->data
单链表的插入标准语句 s->next = p->next; p->next = s;
返回成功
1 | //单链表的插入 |
单链表的删除
- 思路
声明一指针p指向链表头结点 初始化j从1开始
当j<i 时 遍历链表 让p指针后移 j累加
若到链表末尾p为空 则说明i个结点不存在
查找成功 将要删除的结点p->next赋值给q
单链表的删除标准语句p->next = q->next
将q结点中的数据赋值给e 作为返回
释放q结点
返回成功
1 | //单链表的删除 |
单链表结构与顺序存储结构的优缺点
存储分配方式
顺序存储结构用一段连续的存储单元依次存储线性表的数据元素
单链表采用链式存储结构 用一组任意的存储单元存放线性表的元素
时间性能
- 查找
顺序存储结构O(1)
单链表O(n)
- 查找和删除
顺序存储结构需要平均移动表长一半的元素 时间复杂度O(n)
单链表在找出位置的指针后 插入和删除时间复杂度仅为O(1)
空间性能
顺序存储结构需要预分配存储空间 分大了浪费 分小了 易发生上溢
单链表不需要分配存储空间 只要有就可以分配 元素个数也不受限制
注意
线性表需要频繁查找 很少进行插入和删除操作 宜采用顺序存储结构
当线性表中的元素个数变化较大或者根本不知道有多大时 采用单链表结构
静态链表
用数组描述的链表叫做静态链表
静态链表和单链表其实很相像
静态链表结构的定义
1 | //线性表的静态链表存储结构 |
静态链表的初始化
1 | //初始化静态数组链表 |
静态链表的优缺点
- 优点
在插入和删除时 只需要修改游标 不需要移动元素 从而改进了顺序存储结构中插入和删除操作需要移动大量元素的缺点
- 缺点
没有解决连续存储分配带来的表长难以确定的问题
失去了顺序存储结构随机存取的特性
循环链表
将单链表的终端结点的指针端有空指针改为指向头结点 就使整个单链表形成一个环 这种头尾相连的单链表称为循环链表
性质
在终端结点设置尾指针 方便查找终端结点以及头结点
查找上一结点时耗时较大 时间复杂度为O(n)
双向链表
在单链表的每个结点中 在设置一个指向其前驱结点的指针域
双向链表结构的定义
1 | typedef struct DulNode { |
插入和删除和单链表相同 只不过多了个前驱指针域
你知道的越多 你不知道的越多 嘿 我是小博 带你一起看我目之所及的世界……
本文标题:大话数据结构 线性表
发布时间:2022年03月06日 - 12:11
最后更新:2022年03月06日 - 12:14
原始链接:https://codexiaobo.github.io/posts/227292080/
许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。