前言
线性表的顺序存储结构是常用的存储方式,它直接将线性表的逻辑结构映射到存储结构上。
1.头文件申明
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define N 1000
typedef int SeqlistDatatype;
void SeqlistInit(SL *s);//定义函数初始化顺序表
void SeqlistPushBack(SL* ps, SeqlistDatatype x);//尾插
void SeqlistDestory(SL* sl);//销毁顺序表
void Seqlistprint(SL* sl);//打印顺序表
void CheckCapacity(SL* s);//检查顺序表的内存
void SeqlistInsert(SL* s, SeqlistDatatype x, SeqlistDatatype pos);//插入数据
void SeqlistDelete(SL* s, SeqlistDatatype pos);//删除数据
2.建立顺序表
//动态顺序表 按需要开展空间
typedef struct Seqlist
{
SeqlistDatatype *a;
SeqlistDatatype size;//记录存储了多少个有效数据
SeqlistDatatype capacity;//记录容量空间的大小
}SL;
3.初始化顺序表
void SeqlistInit(SL *ps)//初始化顺序表
{
ps->a = NULL;//ps指针(顺序表)指向a的值变成NULL
ps->size = 0;
ps->capacity = 0;//设置容量和数据为0
}
4.销毁顺序表
void SeqlistDestory(SL* ps)//销毁顺序表,释放空间
{
if (ps->a)//当ps->a不为空时
{
free(ps->a);//释放
SeqlistInit(&ps);//初始化
}
}
5.检查容量
void CheckCapacity(SL* ps)
{
assert(ps);//检查ps是否为空
if (ps->size == ps->capacity)//当数据等于容量的时候,说明此顺序表空间已满
{
int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
//新开创一个容量,把容量扩展为原来的两倍
SeqlistDatatype* temp = (SeqlistDatatype*)realloc(ps->a, newCapacity * sizeof(SeqlistDatatype));
if (temp == NULL)
{
perror("realloc fail");
exit(-1);
}
ps->a = temp;
ps->capacity = newCapacity;
}
}
6.打印顺序表
void Seqlistprint(SL* ps)
{
assert(ps);//断言
for (int i = 0; i < ps->size; i++)
{
printf("%d ",ps->a[i]);//从第一个数据开始打印顺序表
}
printf("\n");
}
7.尾插数据
void SeqlistPushBack(SL* ps, SeqlistDatatype x)//顺序表,数据
{
CheckCapacity(ps);//扩容
ps->a[ps->size] = x;//让顺序表a[]size位置上存储数据x
ps->size++;//然后size+1,为下次存数据的位置
}
8.插入数据
void SeqlistInsert(SL* ps, SeqlistDatatype x, SeqlistDatatype pos)//顺序表,插入数据,插入位置
{
assert(ps);
assert(pos >= 0);
assert(pos < ps->size);//断言
CheckCapacity(ps);//扩容
int end = ps->size - 1;
//假如创建了 1,2,3三个数据,size这个时候是等于3的
//所以创建一个变量end-1,方便指针的调用,而且避免了结尾size++后size值不改变的尴尬
while (end >= pos)//这里循环的作用主要是把数据后移
//例如:123 我想在1和2中间插入一个4,我会先调整成1223然后把2改成4
{
ps->a[end + 1] = ps->a[end];
end--;
}
ps->a[pos] = x;//这里就是把想改的位置上换成插入的数据
ps->size++;//新增一个数据,所以size-1;
}
9.删除数据
void SeqlistDelete(SL* ps, SeqlistDatatype pos)//顺序表,删除的位置
{
assert(ps);
assert(pos >= 0);
assert(pos < ps->size);
int begin = pos + 1;
while (begin < ps->size)
{
ps->a[begin - 1] = ps->a[begin];
begin++;
}
//这里就跟增加是一个道理,这里就相当于1423,把4删了之后要把数据迁移1233
//然后最后一位的数据不用管,让size--,所以目前顺序表只有3位数据,第四位数据也不干涉
ps->size--;
}
10.主函数实现以及结果展示
int main()
{
SL sl;
SeqlistInit(&sl);
SeqlistPushBack(&sl, 1);
SeqlistPushBack(&sl, 2);
SeqlistPushBack(&sl, 3);
SeqlistPushBack(&sl, 4);
SeqlistPushBack(&sl, 5);
Seqlistprint(&sl);
SeqlistInsert(&sl, 7, 2);
Seqlistprint(&sl);
SeqlistDelete(&sl, 2);
Seqlistprint(&sl);
SeqlistDestory(&sl);
return 0;
}