顺序表概念
- 顺序表的概念:
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
2.顺序表的结构, 顺序表一般可以分为: - 静态顺序表:使用定长数组存储。
2.静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间大小,所以下面我们实现动态顺序表。
动态顺序表:使用动态开辟的数组存储。
顺序表初始化
void SeqListInit(SLT* psl)
{
assert(psl);//断言 psl是否为空
psl->a = NULL; //数组置空
psl->capacity = psl->size = 0;
}
顺序表尾插
所以我们尾插之前先判断需不需要增容,把增容封装成接口。下面的头插、在某个位置插入数据有需要判断要不要增容,直接调用,防止代码冗余。
void Checkcapacity(SLT* psl)
{
if (psl->size == psl->capacity)
{
//首先判断capaticy是不是为0;如果为0,capacity*2还是为0就会出现问题
size_t newcapacity = psl->capacity == 0 ? 4 : psl->capacity * 2;
psl->a = realloc(psl->a, newcapacity*sizeof(SQDataType));//不要忘记加上类型,我们需要4个整型,不是4个字节
psl->capacity = newcapacity;
}
}
void SeqListPushBack(SLT* psl, SQDataType x)
{
assert(psl);
Checkcapacity(psl);
psl->a[psl->size] = x;
psl->size++;
}
void test()
{
SLT s;
SeqListInit(&s);
//测试
SeqListPushBack(&s, 1);
SeqListPushBack(&s, 2);
SeqListPushBack(&s, 3);
SeqListPushBack(&s, 4);
SeqListPushBack(&s, 5);
SeqListPrint(&s);
}
把打印也封装成接口,用打印的时候直接调用
void SeqListPrint(SLT* psl)
{
assert(psl);
//和遍历数组一样
for (int i = 0; i < psl->size; i++)
{
printf("%d ", psl->a[i]);
}
printf("\n");
}
顺序表头插
void SeqListPushFront(SLT* psl, SQDataType x)
{
assert(psl);
Checkcapacity(psl);//检查空间
int end = psl->size - 1;
//挪动数据
while (end>=0)
{
psl->a[end+1] = psl->a[end];
--end;
}
psl->a[0] = x;
psl->size++;
}
头插 -1 ,-2
SeqListPushFront(&s,-1);
SeqListPushFront(&s,-2);
SeqListPrint(&s);
顺序表尾删
//尾删
void SeqListPopBack(SLT* psl)
{
assert(psl);
assert(psl->size > 0);
--psl->size;
}
尾删一次,测试一下
SeqListPopBack(&s);
SeqListPrint(&s);
顺序表头删
//头删
void SeqListPopFront(SLT* psl)
{
assert(psl);
assert(psl->size > 0);
int begin = 1;
while (begin<psl->size)
{
psl->a[begin -1] = psl->a[begin];//把数据往前挪
begin++;
}
psl->size--;
}
测试一下
SeqListPopFront(&s);
SeqListPrint(&s);
-2就删除了
在pos位置插入数据
void SeqlistInsert(SLT* psl, size_t pos, SQDataType x)
{
assert(psl);
assert(pos <= psl->size && pos >= 0);//插入的位置要在数组内部
Checkcapacity(psl);
size_t end = psl->size;
while (end > pos)
{
psl->a[end] = psl->a[end-1];
end--;
}
psl->a[pos] = x;
psl->size++;
}
测试一下
SeqlistInsert(&s, 1, 8);
SeqListPrint(&s);
删除pos位置的元素
void SeqlistErase(SLT* psl, size_t pos)
{
assert(psl);
assert(pos < psl->size);//删除的数据要在数组范围内
size_t begin = pos + 1;
while (begin<psl->size)//数据往前挪
{
psl->a[begin-1] = psl->a[begin];
begin++;
}
psl->size--;
}
SeqlistErase(&s,0);
SeqListPrint(&s);
顺序表销毁
void SeqListDestory(SLT* psl)
{
if (psl->a)
{
free(psl->a);//释放数组
psl->a = NULL;//置空
}
psl->capacity = psl->size = 0;
}
SeqListDestory(&s);//销毁
自己的建议顺序表这里就是要多画图,由于本人还是初阶有错的地方还请大佬指出。(后面的文章还会有关于顺序表的OJ题)