《数据结构之美---顺序表》

1. 线性表

含义

线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...

线性表在逻辑上是线性结构,也就是说是一条连续的直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

换种方式理解,也就是说逻辑结构只是我们头脑中设想的一种理想状态,但实际上数据是以物理结构存储的。

顺序表和链表都属于线性表

2. 顺序表

(1)概念与结构

概念:顺序表是用一段物理结构连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。

(2)顺序表和数组对比

也就是说顺序表的思想可以类比数组的思想,只是换了一种称谓。

(3)顺序表的分类

1. 静态顺序表
(1)定义及优劣

顾名思义,静态顺序表也就是大小长度确定的一个顺序表,是用定长数组来实现的,你需要多大的空间来存储就申请多大的空间,但这也就会导致有时候空间不够用,或者空间申请过大造成浪费,所以这个使用的场景不多

(2)代码实现

在实现顺序表时就用到了前面C语言中学到的结构体的知识,下面是代码实现:

2. 动态顺序表
(1)定义及优劣

动态顺序表相较于静态顺序表就多了一些灵活性,我们可以随时通过改变数组的大小来决定存储更多还是更少的数据,这一点是比静态顺序表要好的,这也就决定了动态顺序表的应用场景要比静态顺序表要广泛,但是即使可以动态的改变数组的大小,但是每次修改多大范围就太让人头疼,扩大的小了不够用,扩大了多的怕浪费,这也是它的一个小缺点。

(2)代码实现


解析:这里我们定义了一个capacity(容量)来代表这个顺序表的大小,通过改变capacity来实现动态申请,也许有些同学看到这里会有一些疑问,为什么这里要用typedef来重定义这个数组的类型,因为你在实现完这个顺序表之后,你并不确定用户会用这个来存储什么类型的数据,所以在这里重定义的话,在存储不同类型的数据时就可以进行一键替换。

3. 动态顺序表的完整功能实现

(1)动态顺序表的初始化

代码实现
运行结果

到这里我们可以通过调试来看一下有没有成功初始化:

可以看到我们成功的对顺序表进行了初始化

(2)增容实现

首先思考一个问题,在使用顺序表时我们是不是首先要知道这个顺序表有足够的空间来存储数据,所以在使用之前就需要判断这个顺序表有没有足够的空间,如果空间足够就使用,如果空间不够就先扩容再使用,而且一般情况下是每次扩容二倍,下面给出代码实现:

这里我们后面在实现尾插头插的时候都要先判断空间是否足够,为了方便所以我们这里封装了一个函数来实现这个效果。

(3)尾插

思路整理
代码实现
声明
逻辑实现:
调试:

也可以打印出来看一下:

(4)头插

思路整理
代码实现
声明:
逻辑实现:


这里需要注意的一个细节就是在接受这个指针的时候我们用assert断言来判断了一下这个指针是否为空,这样使得这个函数会更加严谨

运行结果;

可以看到我们确实是实现了头插的效果

(5)特定位置插入

思路整理
声明:
逻辑实现:
运行结果:

可以看到我们确实是实现了特定位置的插入

(6)尾删

思路整理:
声明:
逻辑实现:
调试结果:


通过调试可以看到每执行完一次尾删操作,有效数据就少1,达到了尾删的效果

(7)头删

思路整理:
代码实现:
声明:
逻辑实现:
运行结果:

通过代码的运行结果我们可以看到我们的头删确实实现了预期的效果

(8)特定位置删除

思路整理:
声明:
逻辑实现:
运行结果:


通过代码运行结果我们发现我们实现了特定位置删除数据的效果

(9)数据的查找

思路整理:

所谓的查找数据,其实也就是通过循环来遍历数组来看看要查找的数据是否存在如果能找到就返回这个数据所在位置的下标,如果找不到就返回一个负数

代码实现
声明:
逻辑实现:
运行结果:


(10)销毁

思路整理:

其实这里的销毁无非就是将申请的空间归还给操作系统,也就是释放空间,但是这里也分为两种情况,如果指向数组的指针不为空,我才需要将它free掉,否则就无需再次释放了,并且需要将size和capacity都置为零

代码实现
声明:
逻辑实现:
调试结果:


通过调试我们可以看到销毁完之后顺序表中的指向数组的指针置为了空,size和capacity都置为了零。

小结:

1. 每一次插入数据都要先检查顺序表的空间是否足够,不够的话先扩容再插入
2. 每一次删除数据都要先检查顺序表是否有足够的数据可以删除,否则会出错

相关推荐
ccLianLian23 分钟前
数据结构·ST表
数据结构
大锦终1 小时前
【C++】红黑树
c语言·开发语言·数据结构·c++
似水এ᭄往昔1 小时前
【数据结构】——栈
c语言·数据结构
福居路冥想的草莓2 小时前
逆波兰表达式求值(中等)
数据结构
cdut_suye3 小时前
【Linux系统】从零开始构建简易 Shell:从输入处理到命令执行的深度剖析
java·linux·服务器·数据结构·c++·人工智能·python
yaoshengvalve4 小时前
V型球阀材质性能深度解析:专攻颗粒、料浆与高腐蚀介质的工业利器-耀圣
开发语言·网络·数据结构·c++·安全·材质
evolution_language4 小时前
LintCode第68题-二叉树的前序遍历,第67题-二叉树的后序遍历
数据结构·算法·新手必刷编程50题
是店小二呀4 小时前
【算法-哈希表】常见算法题的哈希表套路拆解
数据结构·c++·算法·散列表
jiunian_cn4 小时前
【c++】多态详解
java·开发语言·数据结构·c++·visual studio
究极无敌暴龙战神X8 小时前
hot100-子串-JS
javascript·数据结构·算法