顺序表:(顺序存储)
表的创建及其使用:
首先说明一下:
- 封装函数中,(.h)头文件中包含(所需的头文件,全局变量(包含结构体),函数声明;
- 顺序表的存储特点,只要知道存储空间的首地址,其他的数据都能知道;
- 顺序表一般情况下采用类似数组的方法来存储;
-
顺序表相对链表的优缺点 链表 顺序表 链表是动态开辟空间,只要计算机还有存储空间,就不会出现存满的情况; 顺序表的空间是固定的,开辟好空间后,空间大小就不能动态增加; 插入或者删除一个元素时,只需要改变指针指向即可; 效率低,每次插入和删除元素都要移动多个节点; 链表在删除某个节点后可以直接将该节点用free(该节点的地址)即可将该节点释放; 顺序表的删除存储数据的操作会产生存储空间的碎片; 链表的查询速度慢,每次查找都要从头节点开始依次查询; 循序表可以直接通过定义的下表来查找数据;
-
流程:
- 定义结构体变量:
结构体里面不需要定义结构体指针时,结构体的名字可以省略,但重定义的名字必须要有。
这里可以把里面输入的变量的数据类型重定义,方便修改,数组的大小也同样可以;
- 先是给结构体开辟空间,malloc的返回值为开辟空间的首地址,所以要用结构体类型的指针来定义:
开辟完后要判断是否开辟成功,如果没有开辟成功,就返回一个NULL;
2.1:因为这里使用的是malloc,开辟的内存空间是在堆上,所以需要手动释放开辟的空间,不能多次释放,不然会报段错误;
2.2 开辟空间时要注意开辟空间的数据类型,有具体的数据类型前面要加强转;
3 结构体的初始化:
Memset() 这个就是用来初始化的函数,后面的三个参数分别为:
- 要初始化空间的首地址;
- 要初始化为多少;
- 要初始化的空间大小;
这些基本的准备整完之后:
//就是对顺序表的应用(操作):
第一部分为通用的操作:
要用表就要先判断表是否存在,如果存在就考虑表是否存满,是否为空:
- 再使用表之前要先判断表是否存在:
将表的地址作为参数传入,存在就继续执行功能模块;
不存在就返回NULL,结束程序
- 考虑是否存满(因为是顺序表所以不考虑存满后再加新的内存):
如果要增加内容,必须考虑该判断;
存满就是当表的下标和所定义可存储的数据量相同相同时
2.考虑是否为空:
当要删除数据时,就要先判断表中是否有数据;
判断方法同判满,当下标为初始化的数值时,表为空;
3.测量该结构体中数组的有效长度(没有数有效长度就为0,index为-1;)
有效长度的计算逻辑和数组的类似,长度为下标加一
第二部分:
1.增加内容的思路:(通用操作就不再复述了)
- 先判断该位置与该结构体中数组有效长度的关系;
- 如果位置在这个数组中,将从该位置之后的元素通过循环赋值依次后移一位,最后将该位置的值修改为要插入的。
2 删除数据的思路与增加类似
2.1 第一种是通过输入数据直接删除:
1. 通过循环判断来确定要删除的数据的位置
2.在找到该位置后在进行循环移位来覆盖掉该位置的数据;
2.2通过输入位置来删除数据
- 先判断改位置里是否有数据,有数据进行循环
- 确定开始位置后,判断结束位置,从开始位置开始通过循环将后面的数据依次前移一位
3.查找数据的理解及思路
3.1 通过位置来查看该位置的内容:
1.直接判断输入的位置是否超过数组下标的最大值(数组的有效长度减一跟这个一样)
2.判断完后,如果存在直接返回该位置的数据即可;
3.2 通过数据来查看数据的位置
1.直接通过循环来比较数组里的元素是否有与输入的数据相同的
2.有相同直接返回此时数组元素的下标,没有相同的返回-1结束程序;
4 顺序表的清零和顺序表的销毁
4.1顺序表的清零:
1.直接令下标index为-1,数组全部不进行赋值遍历
4.2 顺序表的销毁
1.顺序表要销毁,必须使指针清零,也就是将指向顺序表的指针的地址赋NULL才能释放开辟的空间。
2.*sqlist是一级指针,必须使用二级指针指向该指针的地址才能达到销毁的目的;(传参时要注意,传递是&sqlist)---sqlist是顺序表的首地址