顺序表
我们先来看看顺序表的概念和结构:
顺序表是用一段
物理地址连续
的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
顺序表一般可以分为:
1.
静态顺序表:使用定长数组存储元素。
![](https://img-blog.csdnimg.cn/154638acc37f43c289d2041c11e713ea.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS25vdXM=,size_20,color_FFFFFF,t_70,g_se,x_16)
这里我们就直接开辟了一个数组,但因为是一次性开辟的,就会有几种情况:
第一种,数组开小了,要放的数据放不下,比如我们要放100个数据,而数组只有10个位置。
第二种,数组开大了,要放的数组没那么多,我只要放10个数据,但你有100个位置,那不就浪费了吗。
所以这里就有第二种顺序表,要用到realloc函数。
我们先malloc一个数组,这个数组不用很大,我们先用着,然后我们那size记录要放的数据,然后capicty记录还能放多少进去,如果size = capicity,那就说明我们放满了,放满了那就要扩容。
接口实现
静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致
N
定大了,空间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间大小,所以下面我们实现动态顺序表。
#define MAX 100
//静态
//struct SeqList
//{
// int arr[MAX];
// int size;// 记录存储个数
//};
struct SeqList
{
int *a;
int size;
int capaity;//数组容量
};
那我们学数据结构,就是为了对这些顺序表进行管理,那管理,通常就是增删查改,那我们就来写函数来模拟实现一下。
在这些操作前,我们得先初始化,在操作完,我们也要销毁,所以我们写两个函数:
初始化:
void SeqListInit(SeqList s)
{
s.a = NULL;
s.size = 0;
s.capicity = 0;
}
当我们写出这样一个函数的时候,我们就要注意这里是传了一个形参过去,我们知道,对形参的操作不会影响到实参,所以我们要传址过去:
void SeqListInit(SeqList* psl)
{
assert(psl);
psl->a = NULL;
psl->size = 0;
psl->capicity = 0;
}