顺序表专题

目录

创作不易,如对您有帮助,还望一键三连,谢谢!!!

1.数据结构相关概念

2.顺序表的结构及其概念

2.1线性表

2.2顺序表的分类

2.2-1静态顺序表

2.2-2动态顺序表

2.3动态顺序表的实现

1.顺序表初始化

2.顺序表的销毁

3.顺序表增容

4.顺序表打印

5.尾插

6.头插

7.尾删

8.头删

9.指定位置之前插入数据

10.删除指定位置数据

11.查找数据


创作不易,如对您有帮助,还望一键三连,谢谢!!!

1.数据结构相关概念

在学习顺序表之前,我们要先大致了解一下数据结构的相关概念。

数据结构是由“数据”和“结构”两词组合⽽来。

什么是数据?常⻅的数值1、2、3、4.....、教务系统⾥保存的⽤⼾信息(姓名、性别、年龄、学历等等)、⽹⻚⾥⾁眼可以看到的信息(⽂字、图⽚、视频等等),这些都是数据。
什么是结构?
当我们想要使⽤⼤量使⽤同⼀类型的数据时,通过⼿动定义⼤量的独⽴的变量对于程序来说,可读性⾮常差,我们可以借助数组这样的数据结构将⼤量的数据组织在⼀起,结构也可以理解为组织数据的⽅式。

比如,你是一个牧场主,有几百头羊(这泼天的财富哈哈)

你要找一只名叫“咩咩”的羊,那么在上面的环境中,寻找起来无异于是大海捞针,但是,如果你把它们圈养在一个个羊圈内,并且编上号码,像这样:

那么此时在寻找特定的羊就很容易了。

像这种把羊分羊圈圈养起来,相当于把数据进行组织管理,方便查找,就是一种数据结构。

概念:数据结构是计算机存储、组织数据的⽅式。数据结构是指相互之间存在⼀种或多种特定关系
的数据元素的集合。数据结构反映数据的内部构成,即数据由那部分构成,以什么⽅式构成,以及数据元素之间呈现的结构。

比如说我们之前学过的数组,就是最基础的数据结构。

那么既然有了数组,为什么还要学习其他的数据结构呢?

假定数组有10个空间,已经使⽤了5个,向数组中插⼊数据步骤:
求数组的⻓度,求数组的有效数据个数,向下标为数据有效个数的位置插⼊数据(注意:这⾥是
否要判断数组是否满了,满了还能继续插⼊吗).....
假设数据量⾮常庞⼤,频繁的获取数组有效数据个数会影响程序执⾏效率。
结论:最基础的数据结构能够提供的操作已经不能完全满⾜复杂算法实现。

所以,我们才会学习顺序表,来实现数据的增删查改。

2.顺序表的结构及其概念

2.1线性表

我们先来了解一下线性表

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

2.2顺序表的分类

首先,顺序表是线性表的一种,它的底层结构其实就是数组,它就是对数组进行了一定程度上的封装,实现了增删查改等功能。

顺序表分为:静态顺序表和动态顺序表

2.2-1静态顺序表

话不多说,我们直接看代码:

        

上面一段代码就是静态顺序表的定义。

我们用define定义来确定数组的长度的原因是方便后续进行统一修改,不然以后数组长度改变要一个一个改咯。

同理,我们把数组的类型用typedef定义成SLDataType方便存储不同类型的数据。

而第二个typedef是把结构体重命名为SL,方便后续代码书写,以后就可以直接用SL,不用写struct SeqList了

但是我们很容易可以看出来静态顺序表的缺点:空间给少了不够⽤,给多了造成空间浪费

2.2-2动态顺序表

其中a是一个指针,指向一个动态开辟的数组。

动态顺序表解决了静态顺序表的缺点,可以增容,所以使用更加广泛。

2.3动态顺序表的实现

动态顺序表的实现,就是实现动态顺序表的功能,而实现动态顺序表我们标准的流程是建立三个文件,如下图所示:

SeqList是顺序表英文单词的缩写,记住就行。

其中:

Seqlist.h 是头文件,放工程所需的头文件以及顺序表的定义,函数的声明

SeqList.c内容就是函数功能的实现

test.c   是用来测试所写函数功能是否正确,最好写一个测试一个,写完再测试,一写一个不吱声

我们要实现的功能大致有以下几种:

我都写上注释了,简直是英文不好的小伙伴的福音哈哈。

接下来我们来一个一个实现:

1.顺序表初始化

这个没有什么好讲的,初始化顺序表,就把顺序表的成员变量都初始化一下。

2.顺序表的销毁

这个和初始化差不多,也比较简单,不再赘述。

3.顺序表增容

这段代码实现了顺序表的增容。

这段代码后面的是一个三目表达式,意思是capacity为0的话就把newCapacity赋值为4,否则就把newCapacity赋值为二倍的capacity。

至于为什么容量为零赋值为4,不为零赋值为二倍的初始容量,而不是其他的值。答案是:

这是经过大量的数学统计统计出来的最佳做法。

什么?怎么统计出来的,我也不会。

之后的代码也很容易看懂,就不再赘述,就有一点需要注意:一定要判断一下tem是否为空指针,即realloc是否开辟空间失败。我们之前也讲过。

4.顺序表打印

5.尾插

因为后面涉及到对ps指针的解引用,所以要断言一下,确保ps不为空指针。

插入数据,肯定要检查一下是否需要扩容。

然后进行插入数据,插入数据的示意图如下:

6.头插

开始和尾插一样的步骤。

头插数据的思路如下:

7.尾删

与上面头尾插入不同的是,这里多了一个assert(ps->size),即顺序表不能为空,否则怎么能size--呢?

思路如下:

8.头删

前面与尾删一样

思路示意图如下:

9.指定位置之前插入数据

与头插类似,只是范围变了,将pos及以后的数据整体后移一位即可。

10.删除指定位置数据

与头删类似,将数据向前挪动即可,只是范围不同。

11.查找数据

代码比较简单,不在赘述。

至此我们实现了顺序表的一系列功能。

  • 37
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值