线性表的顺序存储概述:开辟一块连续的地址空间,然后将数据元素存入该地址空间,构成一个类似于数组的存储结构。
实现:
环境:Windows10 专业版 64位
VisualStudio2022 企业版
1、定义线性表的数据类型
其中使用条件编译,判断宏是否被定义的方式,主动的来防止头文件的重复包含。
结构体类型的第一个元素(data)代表指向数据域空间的指针,第二个元素(size)用来记录线性表空间已存储的元素个数,第三个元素(capacity)用来记录线性表空间的存储大小(存储元素的总数),MAX_SIZE表示初始化线性表的大小。
2、初始化线性表
初始化函数需要传入线性表类型的地址,并使用assert宏来判断传入的指针是否为空。
使用malloc在堆区开辟10个int类型大小的空间,并判断空间开辟是否成功(这里可以进行相应警告的打印,这里就不赘述了),空间开辟失败返回NULL值,对NULL值取反结果就是true,空间开辟成功使用指向数据域的指针指向开辟成功的空间,后续便可以使用该指针管理这块空间。初始化元素个数为0,存储大小为自定义的存储大小;至此,一个线性表的结构就创建完成。
对线性表的相关操作:
1.数据元素的使用:
查看、使用线性表的index的前一个位置的元素,即使用index下标访问对应的空间内容并返回。当然也要对下标位置的合法性进行判断。
2、线性表的遍历:
使用与数组相同的遍历方式,结束位置为size指向的位置
3、线性表的尾部插入数据:
传入线性表变量的地址和插入的数据
size下标即为尾部可插入数据的位置,使用指针家索引的方式找到该空间,并为该空间赋值为传入的数据,最后更新线性表的大小,插入一个数据,大小加一。但这里存在线性表空间存储满的情况,所以要对这种情况进行判断,并为其扩大空间,使其能存储更多数据:
空间如果满了,就使用realloc重新开辟一块更大的空间(这里重新开辟原空间的两倍),realloc会将原空间的数据拷贝到新空间,并返回新开辟空间的指针,判断空间是否开辟成功,并更新线性表的空间和存储大小,就实现了动态开辟空间的线性表。
4、线性表尾部元素的删除
这里我们要大概理解一个关于数据删除的概念:数据删除本质上就是让数据无法访问。所以这里对于线性表尾部的数据的删除就是让数据无法访问,因为我们是通过size进行下标访问数据,size下标指向线性表最后一个数据,对size--,就是让最后一个元素无法访问,即:
当然,这里我们得判断一下线性表中是否存在数据。
测试: