数据结构——顺序表
概念及结构
概念
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构(不能跳跃着存放),一般情况下采用数组存储。在数组上完成数据的增删查改。
分类
- 静态顺序表:使用定长数组存储元素
- 动态顺序表:使用动态开辟的数组存储
静态的顺序表(不做实现)
#define N 10 //宏设置数组大小,增加灵活性
typedef int SLDataType;//重命名需要使用的类型,这里是int类型
struct SeqList
{
SLDataType a[N];//用数组来存储数据
int size;//存储数据的个数
};
缺陷:大小是固定的,不好确定开辟数组的大小
动态的顺序表(重点实现)
typedef int SLDataType;//重命名需要使用的类型,这里是int类型
typedf struct SeqList
{
SLDataType* a;//指向动态开辟的数组
int size;//存储数据的个数存储空间的大小
int capacity;//容量空间的大小
}SL;
这里又会出现空间满了怎么扩容的问题,扩容太少会使得内存空间碎片化,有效率的损失,扩容太多又造成空间浪费。
那多少扩容合适呢,一般2倍比较合适
不建议进行缩容:realloc原则上可以给比原来空间要小的数据空间,那样的话会对开辟的容量进行缩小,也分两种情况原地缩和异地缩,异地缩的时候会对性能造成影响,并且顺序表需要插入数据,缩容之后添加数据发现空间不够又需要扩容,这时候又会出现原地扩,异地扩的问题,对性能造成影响。
缩容:以时间换空间
不缩容:以空间换时间
原则:不要直接去操作改变原始的结构体,需要使用函数来对结构体进行操作
初始化和销毁
void SLInit(SL* psl);//初始化
void SLDestory(SL* psl);//销毁
初始化函数实现
-----------------------------------------------------------
void SLInit(SL* psl)
{
assert(psl);
psl -> a = NULL;
psl -> capacity = psl -> size = 0;
}
-------------------------------------------------------------
void TestSeqList()
{
SL s;//创建了类型为SL的结构体变量s
SLInit(&s);//调用初始化函数,初始化s
}
int main()
{
TestSeqList1();//调用测试函数来完成测试,方便调试
}
注意:这里需要传递指针,才能达到初始化的效果。
空间销毁函数实现
----------------------------------------------------
void SLDestory(SL* psl)
{
assert(psl);
if(psl -> a)
{
free(psl->a);
psl -> a = NULL;
psl -> capacity = psl -> size =