从这节课开始就要进入数据结构的课了,小伙伴们,你们准备好了吗?系好安全带,我们要发了。
顺序表的引入
概念
相互存在一种或多种特定关系的数据元素的集合
大白话:一个结构体包含了一些数据元素
概念不重要,大家这么理解一下就行,有兴趣可以自行搜索一些关于数据结构的专业解释
那么我们先来讲一下顺序表的里会有的数据元素
struct SQList 这是一个结构体,相信大家都可以理解。什么?你说你不理解结构体?没事,那我给大家简单的回顾一下结构体
结构体的简单回顾
结构体的基本框架:
struct 结构体的名字
{
}(结构体的缩名);//注意这里是有分号的哦
结构体的元素定义:
和我们一开始学的变量定义是一样的。
eg. int size;
那么也许会有人问我们现在所创建的数组是int类型,但如果不是int类型,岂不是得一个一个修改?
当然了,我们的前辈早已想到了这个问题所以创建了另一个思路:
这个思路很简单,具体的模板我放在下面了,建议大家收藏一下。
模板:typedef 类型/结构体的缩名 新定义的名字;
思路讲解:我们使用定义变量的方法,运用自定义类型的typedef给想要包含的类型或结构体的缩名起一个新的名字,之后每当需要使用该类型或者结构体的缩名时直接替换,当需要修改时,也只需要修改这一行的代码。
顺序表的底层
顺序表的底层是数组,因此我们需要用我们上面所写的自定义类型的新名字以指针的方式去定义一个数,并且还要记录有效的元素个数以及空间大小。
本篇文章的主要内容
温馨提示:图片中的代码所在文件是顺序表的头文件。
顺序表的创建
初始化时,需要将数组设为空,并且有效个数和所用空间均为0。
有创建就有销毁,那么我们先来看销毁
顺序表的销毁
当我们的程序走到销毁时,一定是有多余的空间是被占用的,所以当程序进入到这个函数时应当先释放数组arr所占用的多余空间,并且要将数组恢复为空。当然啦有效个数和空间也要恢复为0。
顺序表的尾插
这里我们先讲思路
首先我们先看第二种情况,这是我们容易想到的
紧接着,我们来看第一种情况
总结一下上面的两种情况:
当空间不够时,我们需要先申请增加空间容量,再插入数据,当空间足够时直接插入数据即可。
于是代码如下
函数——检查空间是否充足
当我们的程序进行到检查空间是否充足时,进入该函数,先判断空间是否已被占用完,如果还要剩余的空间,则跳出这个函数,进行插入语句。如果已被占用完,那么就会进入下一个判断,也就是空间是否为0,如果为0,则给出一定的空间,如果不为0,则成倍增加空间。
温馨提醒:malloc calloc 是申请空间,realloc是增加空间容量。
顺序表的头插
首先声明一下顺序表不为空,因为顺序表为空时,无法进行头插,之后通过遍历数组将元素进行头插。
顺序表的尾删
尾删比较简单,我们只需要确保顺序表不为空以及有效数字的个数不为空即可。
顺序表的头删
在确保顺序表不为空以及有效数字的个数不为空的情况下,我们通过循环,将整体的数往前移一个单位,注意:移完数字后千万别忘记将有效数字的个数减一!!!
指定位置添加数字
在确保顺序表不为空以及指定位置不为空的情况下,先检查空间,检查完空间后,通过循环,将元素从pos开始到结尾的元素统一往后移一个单位。空出位置后进行插入,并且size的个数要+1。
指定位置删除数字
在确保顺序表不为空以及指定位置不为空的情况下,通过循环,将从pos开始到末尾的元素统一往前移一个单位,记得将size的个数减一哦。
输出顺序表
顺序表的输出和数组的输出没什么区别,所以我不多讲了。
另外我在和大家分享一下我在写顺序表时遇到的问题
解决方案就是将x64改成x86,即可解决该问题了
测试文件的代码
最后做一下总结:
本篇文章需要学会的内容有:typedef 类型/结构体的缩名 新定义的名字;以及typedef struct 结构体名{
}结构体缩名;
需要巩固的内容有指针、循环,以及部分函数的使用。
以上就是本篇文章的内容,本篇文章的内容对于初学数据结构的同学来说会比较难,但是熟能生巧,相信不久的将来你也可以成功的