顺序表
顺序表是什么?
顺序表是在计算机内存中以数组的形式保存的线性表,线性表是最基本、最简单、最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系。
顺序表代码构思
创建文件
首先创建3个文件分别是一个头文件和二个源文件
创建结构体
在头文件 SeqLIst.h 里面写
创建一个结构体类型,typedef定义一下方便之后写代码,名字随便取
typedef int SLDataType; //重命名
typedef struct Seqlist
{
SLDataType* a;
int size; //储存有效数据
int capacity; //容量
}SL;
在源文件 test.c 里面写
创建一个结构体
int main()
{
SL s; //创建结构体
system("pause");
return 0;
}
初始化
在头文件 SeqLIst.h 里面写
void SeqListInit(SL* ps); //初始化
在源文件 SeqList.c 里面写
void SeqListInit(SL* ps) //初始化
{
ps->a = (SLDataType*)malloc(sizeof(SLDataType)*4); //开辟内存 16字节 SLDataType是int 4字节
if (ps->a == NULL) //如果初始化失败,就没有必要继续下去了
{
printf("申请内存失败\n");
exit(-1); //退出
}
ps->size = 0; //目前容量,因为还没有使用,所有为0
ps->capacity = 4; //总容量
尾插
在头文件 SeqLIst.h 里面写
void SeqListPushBack(SL* ps, SLDataType x); //尾插
在源文件 SeqList.c 里面写
SeqListCapacity(ps);这个扩容函数先不管,后面会说
void SeqListPushBack(SL* ps, SLDataType x) //尾插
{
SeqListCapacity(ps); //扩容
ps->a[ps->size] = x; //size是最大有效数据就是最后一行,直接赋值
ps->size++; //因为尾插了一个数据,所以要增加一个有效数据
}
内存扩容
在头文件 SeqList.h 里面写
void SeqListCapacity(SL* ps); //内存不够,就扩容
在源文件 SeqList.c 里面写
如果一直插入内存就会面临一个问题,就会越界,这个时候就需要去扩容
ps->size是目前使用内存
ps->capacity是所拥有的内存
目前使用内存大于所拥有内存就需要扩容,不然就越界,程序挂掉
void SeqListCapacity(SL* ps) //扩容
{
assert(ps); //断言
if (ps->size >= ps->capacity) //内存如果不够就扩容
{
ps->capacity *= 2; //提升2被空间,防止不断申请内存
ps->a = (SLDataType*)realloc(ps->a, sizeof(SLDataType)*ps->capacity);//申请添加内存
if (NULL == ps->a) //扩容失败检查
{
printf("申请空间失败\n");
exit(-1); //退出
}
}
}
尾删
在头文件 SeqList.h 里面写
void SeqListPopBack(SL* ps);//尾删
在源文件 SeqList.c 里面写
void SeqListPopBack(SL* ps) //尾删
{
if (ps->size > 0) //不能小于零,否则变成-1就会出问题,因为如果下次要插入就等于没有插入
{
ps->size--; //有效数据删除
}
}
打印
写了这些代码,我们还需要看看实际效果
在头文件 SeqList.h 里面写
加上const防止修改,只需要打印就行了
void SeqListprint(const SL* ps); //打印
在源文件 SeqList.c 里面写
void SeqListprint(const SL* ps) //打印
{
int i = 0;
for (i = 0; i < ps->size; i++)
{
printf("%d ",ps->a[i