这天,小明和小亮刚做完核酸,看了看下一节课,是张三老师的数据结构课程,决定不逃课了,兴致冲冲地来到教室,看到老师正拿着一本《大话数据结构》的书看着,边看边点头,让他两甚是好奇
小小提醒:结尾有思维导图,点赞评论就是对我最大的鼓励呀
小明和小亮和张三打了个招呼,倒是把张三惊了一跳,好奇的小明便问他,什么是数据结构啊? 于此同时,上课铃也响了
张三老师倒是反过来问了小明一句,我们在学习过程中,经常用什么方式把数据放在一起呢?
小明还在想着啥是数据结构
小亮倒是不自信地说了一句——变量?
张三摇摇头,是放在一块的数据哦?
小亮又猜,数组?
没错,张三点点头,数组就能够看成一种数据结构
数据结构就是一群数据按照一定的结构组合在一起就可以理解为数据结构
官方语言是 :数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的 数据元素的集合。
当然,你也可以把他叫做数据的结构
常见的数据的结构有这么几种
有线性的,有树形的,有图形的,这些我们以后都会接触
咱们这两天的重点,就是把线性的数据结构弄明白
好,小明和小亮异口同声地答道
小亮又摸摸脑袋,那老师,我们知道数据结构,能用他做什么呢?
小明在知道数组也是数据结构后,就抢答道
能够找数据,能够添加数据和删除数据,数组就能这么干
张三老师很高兴,没错,数据结构的基本操作就是
创建,增删查改
小明这是就问了,那增删查改,不同的结构有什么不一样呢?
好问题,当我们讲完了数据结构,你就明白了,张三说
我们现在要介绍第一种数据的结构
线性表
小亮疑惑道,为什么他叫线性表呢?难道它像锁链一样一个环套着一个环连在一起吗?
没错,我们经常使用线性表而不自知,当数据是首尾依次相连的,那这种数据结构就是线性表
但是注意,这种相连是逻辑上的相连,并不只是空间上的相连
小明脱口: 数组就是典型的线性表,但是我们好像还只接触过数组,还有空间不相连的线性表吗?
好像真是这样,小亮也赞同
张三笑笑说,数组是一种线性表,但是线性表还包含许多不同的兄弟
像 链表,栈,队列等,像链表,就不一定是空间上的相连
我们先来介绍线性表的第一个兄弟—顺序表
小亮吐槽道,说过好多遍了,不就是数组么?
张三说是,但不完全是
顺序表指的是 一组数据是依次放在一段连续的物理地址的 线性结构
啥呀,小亮说
小明解释说,就是 你的数据是连着放的,放数据的空间也是连着的
张三看小亮明白了,继续说
顺序表和数组的的区别就是,不按空间顺序地放数据,但是顺序表的数据是要按空间顺序放的
这有是什么意思,小亮又懵了,小明也不知道
张三就随手画了一张图
小亮很快就明白了,数据结构还是要画图,才能看明白
随后,张三老师继续道,顺序表有静态的顺序表和动态的顺序表
静态就是说,连续的空间开辟后没有再添加和减少的可能
那如果我的一块空间能存100个数,只用了5个,那不是就浪费95个了吗?
那如果我要存储100个数,空间只有5个,那不就存不下了吗?
动态储存能够减少空间的浪费
是的,所以我们一般使用动态的顺序表,但是怎么样去创建一个动态的顺序表呢?
他还有什么好处呢?
动态开辟的信息储存在堆区中,这些信息在函数栈帧销毁后不会消失,我们在这个基础上才能操作顺序表
小亮很麻溜地就定义了一个结构体,叫做顺序表
typedef struct sequencelist
{
int* Link;
}SL;
int main()
{
SL* ps;
ps->psl = (int*)malloc(10*sizeof(int));
}
很快小亮就意识到一个问题,我要什么时候扩容呢?
他问张三,张三随后展示出了顺序表的定义
typedef int Datatype
typedef struct sequencelink
{
Datatype* Link;
int size;
int capcity;
}SL;
小明立刻指出,哦,size 记录的是顺序表中实际存储的数据个数,capcity 就是说顺序表的容量,当我要扩容,只要判断 size 是否和 capcity 相等就可以了
张三点点头,我们先初始化一个顺序表吧,然后测试一下吧
void SLInit(SL* ps)
{
ps->Link = NULL;
ps->size = 0;
ps->capcity = 0;
}
void Test1()
{
SL s1;
SLInit(&s1)<