线性表
本篇文章将详细讲述数据结构 线性表 章节的内容,没想到距离上次更新已经快两个礼拜了。
本教程编程语言采用 JAVA ,文章框架参考自 HUST数据结构PPT ,源码内容参考自 尚硅谷 JAVA 数据结构教程 。
线性表章节部分将简单讲述概念方面的问题,重点将放在具体的代码实现过程中。
线性表的定义
线性表的逻辑结构
- 线性表:由$n(n≥0)$个数据元素$(a_1,a_2,…, a_n)$构成的有限序列,记作: $L=(a_1,a_2,…,a_n)$,$a_1$称为首元素,$a_n$称为尾元素。
- 表长:线性表中数据元素的数目。
- 空表:不含数据元素的线性表。
在线性表$L=(a_1,a_2,…,a_n)$中:
- $a_{i-1}$是$a_i$的直接前驱(1<i<=n)
- $a_{i+1}$是$a_i$的直接后继(1<=i<n)
- $a_1$没有前驱,$a_n$没有后继,$a_i$有且仅有一个前驱和后继(1<i<n)
抽象数据类型线性表的定义
抽象类型的线性表主要定义几个属性和方法
InitList(&L)
//构造空表 L。LengthList(L)
//求表 L 的长度GetElem(L,i,&e)
//取元素 ai,由 e 返回 aiPriorElem(L,ce,&pre_e)
//求 ce 的前驱,由 pre_e 返回InsertElem(&L,i,e)
//在元素 ai 之前插入新元素 eDeleteElem(&L,i)
//删除第 i 个元素EmptyList(L)
//判断 L 是否为空表
线性表的顺序表示(顺序存储结构)
顺序分配
- 定义:将线性表中的数据元素依次存放到计算机存储器中一组地址连续的存储单元中, 这种分配方式称为顺序分配或顺序映像。由此得到的存储结构称为顺序存储结构或向量(一维数组)。
- 线性表的几个参数
a
:首元素的地址。sizeof(a[0])
:线性表元素所占的储存空间的大小。sizeof(a[n])
:线性表的长度。
寻址公式
顺序储存方式的地址查询与数组类似,故不再赘述,感兴趣的读者可以自己查询相关资料。
顺序储存结构的评价
- 是一种随机存取结构,存取任何元素的时间是一个常数,速度快。
- 结构简单,逻辑上相邻的元素在物理上也是相邻的。
- 不使用指针,节省存储空间。
- 插入和删除元素要移动大量元素,消耗大量时间。
- 需要一个连续的存储空间。
- 插入元素可能发生“溢出”。
- 自由区中的存储空间不能被其它数据占用(共享)。
稀疏数组的实现
- 书写思路:
二维数组转稀疏数组:
- 遍历原始二维数组得到,有效数字的个数
sum
。 - 创建稀疏数组
int[sum+1][3]
。 - 记录
chessRow
和chessCol
以及有效数字count
。 - 遍历数组,为稀疏数组
sparseArr
赋值。 - 返回稀疏数组。
- 遍历原始二维数组得到,有效数字的个数
稀疏数组转二维数组:
查看代码实现
- 编写函数
- 输出结果
线性表的链式存储结构
基本概念
- 链表是以 节点 的方式来存储,是 链式存储。
- 每个节点包含 data 域、next 域,next 域指向下一个节点。
- 链表还分:带头节点、不带头节点,根据实际需求来确定。
- 链表的各个节点 不一定是连续存储。
单链表
单链表的一般形式
单链表的代码实现(考虑一个这样的场景使用带头单链表实现P5R Phantom Thieves原教程是用的水浒传英雄的管理为啥我换成P5R呢?这是因为vscode Junit单元测试的时候输出中文乱码,我上网搜索了一下也没什么好的解决办法,索性全部用英文算了,正好最近我在打P5R就干脆拿来用了。的成员管理)
查看代码实现
- 完成对怪盗团成员的增删查改操作。
- 第一种方法:在添加成员时,直接添加到链表的尾部。
- 第二种方法:在添加成员时,根据序号将成员添加到指定的位置,如果有这个序号,则添加失败并给出提示。
- 构造链表节点的类
- 单链表反转思路
- 定义一个新的
reverseHead
节点。 - 从原链表中依次取出节点,并始终添加到
reverseHead
的第一个节点。next = cur.next;
cur.next = reverseHead.next;
reverseHead.next = cur;
cur = next;
- 将
head
节点的next
指向reverseHead
节点的next
。 - 构造链表类
- 测试函数
- 输出结果
</ol>
</li>
</ol>
</div> - 定义一个新的
双向链表
双向链表节点定义与单向链表大致相同,只不过多了一个指向前一个节点的指针域。
- 双向链表相关函数的实现思路
基本实现思路与单向链表相同,可在前者的基础上作出修改
- 双向链表的代码实现
查看代码实现
- 函数编写
- 测试用例
- 输出结果
循环链表
循环链表的讲解将与约瑟夫问题结合实现
- 实现基本思路
- 先构成一个有
n
个节点的单循环链表。 - 然后由
k
节点起从1
开始计数。 - 计数到
m
时,对应节点从链表中删除,然后从下一个节点又从1
开始计数
- 先构成一个有
- 代码实现
查看代码实现
- 函数编写
- 测试用例
- 输出结果
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 希亚的西红柿のBlog!评论