#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
typedef int SLDatatype;
typedef struct SeqList
{
SLDatatype* a; //存储数据空间的指针
int size; //有效数据的个数
int capacity; //容量空间大小
}SeqList;
//接口
void SeqListInit(SeqList* ps);//初始化
void SeqListDestory(SeqList* ps);//销毁
void SeqListPrint(SeqList* ps);//打印
void SeqListPushBack(SeqList* ps, SLDateType x);//尾插
void SeqListPushFront(SeqList* ps, SLDateType x);//头插
void SeqListPopFront(SeqList* ps);//头删
void SeqListPopBack(SeqList* ps);//尾删
int SeqListFind(SeqList* ps, SLDateType x);// 顺序表查找
void SeqListInsert(SeqList* ps, size_t pos, SLDateType x);// 顺序表在pos位置插入x
void SeqListErase(SeqList* ps, size_t pos);// 顺序表删除pos位置的值
//接口实现
//初始化
void SeqListInit(SeqList* ps)
{
ps->a = (SLDataType*)malloc(sizeof(SLDataType)* 4);
if (ps->a == NULL)//判断是否增容成功
{
printf("malloc fail \n")
exit(-1);
}
memset(ps->a, 0, sizeof(SLDatatype)* 4);//把数组的每个字节都初始化为0(可有可无)
ps->size = 0;//有效个数为0
ps->capacity = 4;//空间为4
}
//销毁
void SeqListDestory(SeqList* ps)
{
free(ps->a);
ps->a = NULL;//把a置为空
ps->size = ps->capacity = 0;//有效个数和空间都置为0
}
//打印
void SeqListPrint(SeqList* ps)
{
for (int i = 0; i < ps ->size; i++)
{
printf("%d ", ps->a[i]);
}
printf("\n");
}
//增容
void CheckCapacity(SeqList* ps)
{
if (ps->size == ps->capacity)//空间不够,需要增容,一般情况变为原来的二倍
{
SLDatatype* tmp = (SLDatatype*)realloc(ps->a, sizeof(SLDatatype)*ps->capacity * 2);
if (tmp == NULL)//判断是否增容成功
{
printf("realloc fail \n")
exit(-1);
}
}
ps->a = tmp;//把有新的空间给a
ps->capacity *= 2;空间变为原来的二倍
}
//尾插
void SeqListPushBack(SeqList* ps, SLDateType x)
{
assert(ps);
CheckCapacity(ps);//调用上面的增容接口
ps->a(ps->size) = x;//直接在尾部插入x
ps ->size++;
}
//头插
void SeqListPushFront(SeqList* ps, SLDateType x)
{
assert(ps);
CheckCapacity(ps);
int end = ps->size - 1;
while (end <= 0)
{
ps->a[end + 1] == ps->a[end];
end--;
}
ps->a[0] = x;
ps->size++;
}
//尾删
void SeqListPopBack(SeqList* ps)
{
assert(ps);
//若无此步骤size为0时再size--为-1
assert(ps->size > 0);
ps->size--;
}
//头删
void SeqListPopFront(SeqList* ps)
{
int begin = 1;
while (begin < ps->size)
{
ps->a[begin - 1] = ps->a[begin];
begin++;
}
ps->size--;
}
// 顺序表查找
int SeqListFind(SeqList* ps, SLDateType x)
{
//顺序表查找,可以查找一个数在不在数组里,并返回其下标,配合其他接口使用
assert(ps);
for (int i = 0; i < ps->size; ++i)
{
if (ps->a[i] == x)
{
return i;
}
}
return -1;
}
// 顺序表在pos位置插入x
void SeqListInsert(SeqList* ps, size_t pos, SLDateType x)
{
assert(ps);
assert(pos >= 0 && pos < ps->size);
CheckCapacity(ps);
int end = ps->size - 1;
while (end >= pos)
{
ps->a[end + 1] = ps->a[end];
end--;
}
ps->a[pos] = x;
ps->size++;
}
// 顺序表删除pos位置的值
void SeqListErase(SeqList* ps, size_t pos)
{
assert(ps);
assert(pos >= 0 && pos < ps->size);
int begin = 0;
while (pos < ps->size - 1)
{
ps->a[pos] = ps->a[pos + 1];
pos++;
}
ps->size--;
}
顺序表各项功能的接口及实现
最新推荐文章于 2023-11-23 18:17:26 发布