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

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. 每一次删除数据都要先检查顺序表是否有足够的数据可以删除,否则会出错

相关推荐
绍兴贝贝41 分钟前
代码随想录算法训练营第五十二天|KM101.孤岛的总面积|KM102.沉没孤岛|KM103.水流问题|KM104.建造最大岛屿
数据结构·人工智能·python·算法·力扣
SkyrimCitadelValinor1 小时前
python【数据结构】
开发语言·数据结构·python
就爱学编程1 小时前
重生之我在异世界学编程之数据结构与算法:深入数和二叉树篇
数据结构
_周游2 小时前
【C语言】_const修饰指针变量
c语言·数据结构·算法
爱学习的徐徐7 小时前
【数据结构】链表链表
数据结构·链表
高 朗10 小时前
【算法刷题】链表
数据结构·算法·链表
走在考研路上10 小时前
力扣459 重复的字符串
数据结构·算法·leetcode
Komorebi_awa11 小时前
xdoj-字符串-556,为什么字符不能被正常读入
c语言·数据结构·算法
一只小bit12 小时前
深入刨析数据结构之排序(下)
c语言·数据结构·算法·排序算法
风间琉璃""13 小时前
PWN的知识之栈溢出
数据结构·算法·网络安全·pwn·二进制安全·栈溢出