目录
1、顺序表的创建
2、接口函数的声明
3、初始化
4、销毁顺序表
5、找x,找到返回下标,未找到返回-1
6、指定pos位置插入x
7、删除pos位置的数据
8、尾插数据
9、打印顺序表
10、检查并扩容
11、尾删数据
12、头插数据
13、头删数据
typedef int SLDataType;
typedef struct SeqList
{
SLDataType* a;
int size;
int capacity; // 数组实际能存储的空间容量是多少个
}SL;
void SeqListInit(SL *ps); // 初始化顺序表
// 形参 是实参的临时拷贝,不会影响实参 - 传值操作
// 所以传地址
void SeqListDestory(SL* ps); // 使用完后销毁,防止内存泄露
void SeqListCheckCapacity(SL* ps); // 检查容量+扩容
void SeqListPrint(SL* ps); // 打印数据
void SeqListPushBack(SL* ps, SLDataType x); // 尾插
void SeqListPopBack(SL* ps); // 尾删
void SeqListPushFront(SL* ps, SLDataType x); // 头插
void SeqListPopFront(SL* ps); // 头删
int SeqListFind(SL* ps, SLDataType x); // 找到x返回下标,未找到返回-1
void SeqListInsert(SL* ps, int pos, SLDataType x); // 指定pos位置插入x
void SeqListErase(SL* ps, int pos); // 删除pos位置的数据
void SeqListInit(SL*ps)
{
ps->a = NULL;
ps->size = ps->capacity = 0;
}
void SeqListDestory(SL* ps)
{
free(ps->a);
ps->a = NULL;
ps->capacity = ps->size = 0;
}
int SeqListFind(SL* ps, SLDataType x)
{
int begin = 0;
while (begin++ <= ps->size)
{
if (ps->a[begin] == x)
return begin;
}
return -1;
}
void SeqListInsert(SL* ps, int pos, SLDataType x)
{
assert(pos <= ps->size && pos >= 0);
// 判断+扩容
SeqListCheckCapacity(ps);
// 挪动数据,从后往前
int end = ps->size - 1;
while (end >= pos)
{
ps->a[end + 1] = ps->a[end];
end--;
}
// 插入数据
ps->a[pos] = x;
ps->size++;
}
void SeqListErase(SL* ps, int pos)
{
assert(pos < ps->size && pos >= 0);
int begin = pos + 1;
while (begin < ps->size)
{
ps->a[begin - 1] = ps->a[begin];
begin++;
}
ps->size--;
}
void SeqListPushBack(SL* ps, SLDataType x)
{
SeqListInsert(ps, ps->size, x);
}
void SeqListPrint(SL* ps)
{
int i = 0;
for (i; i < ps->size; i++)
{
printf("%d ", ps->a[i]);
}
printf("\n");
}
void SeqListCheckCapacity(SL* ps)
{
// 如果没有空间(0个)或空间不足(满了)
if (ps->size == ps->capacity)
{
int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
// 三目操作符 是否等于0,是给4,否则给2倍原空间
SLDataType* tmp = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * newcapacity);
// 开辟空间
if (tmp == NULL)
{
printf("realloc fail\n");
exit(-1); // 异常终止程序
}
ps->a = tmp; // 开辟的空间给结构体
ps->capacity = newcapacity;// 开辟的大小给原大小
}
}
void SeqListPopBack(SL* ps)
{
SeqListErase(ps, ps->size-1);
}
void SeqListPushFront(SL* ps, SLDataType x)
{
SeqListInsert(ps, 0, x);
}
void SeqListPopFront(SL* ps)
{
SeqListErase(ps, 0);
}