头文件:SeqList.h
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
//实现顺序表的基本单位:数组(静态顺序表 动态顺序表)
typedef int SLDataType;//数据类型
typedef struct SeqList
{
int capacity;//顺序表的大小
int size;//有效数据个数
SLDataType* arr;//动态柔性数组
}SL;//定义结构体时方便
//数据初始化
SL SLInit(SL* s);
//数据打印
void Print(SL s);
//数据开辟or扩容
void SLCheckCapacity(SL* s);
//数据插入 头插/尾插
void SLPushFront(SL* s, SLDataType x);
void SLPushBack(SL* s, SLDataType x);
//数据删除 头删/尾删
void SLPopFront(SL* s);
void SLPopBack(SL* s);
//指定位置的插入or删除
//在指定位置之前插入数据
void SLInsert(SL* s, int pos, SLDataType x);
//删除指定位置的数据
void SLErase(SL* s, int pos);
//顺序表的销毁
void SLDestroy(SL* s);
实现:SeqList.c
#include"SeqList.h"
//数据初始化
SL SLInit(SL* s)//写代码要动脑子的!传参传什么?需要改变:地址& 不用改变:数值
{
s->capacity = s->size = 0;//结构体.指针->
s->arr = NULL;
}
//数据打印
void Print(SL s)
{
printf("capacity = %d\nsize=%d\n", s.capacity, s.size);
for (int i = 0; i < s.size; i++)
{
printf("s.arr[%d]=%d\n", i, s.arr[i]);
}
}
//数据开辟or扩容
void SLCheckCapacity(SL* s)
{
if (s->size == s->capacity)
{
//int NewCapacity;
//if (s->capacity == 0)//开辟条件
//{NewCapacity =s->capacity = 10;}
//else//扩容条件
//{int NewCapacity = 2 * s->capacity;}
int NewCapacity = s->capacity == 0 ? 2 : 2 * s->capacity;
SLDataType* tmp = (SLDataType*)realloc(s->arr, NewCapacity * sizeof(SLDataType));//开辟or扩容//数据类型写错了
if (tmp == NULL)
{
perror(realloc);
exit(1);
}
//调整变量 动态开辟内存释放与否?指针调整
s->capacity = NewCapacity;
s->arr = tmp;//arr一定要是指针 不可以是arr[0]的数组
tmp = NULL;
}
}
//数据插入 头插/尾插
void SLPushBack(SL* s ,SLDataType x)
{
//断言——粗暴的解决方式
assert(s != NULL);
//判断——温柔的解决方式
if (s == NULL)
{
return;
}
//先判断够不够 不够就要扩容
SLCheckCapacity(&s);
//够的话直接插入
s->arr[s->size] = x;
s->size++;
}
void SLPushFront(SL* s, SLDataType x)
{
//断言——粗暴的解决方式
assert(s != NULL);
//先判断够不够 不够就要扩容
SLCheckCapacity(&s);
//够的话向后移动
for (int i = 0; i < s->size; i++)
s->arr[s->size - i] = s->arr[s->size - i - 1];
s->arr[0] = x;
s->size++;
}
//数据删除 头删/尾删
void SLPopBack(SL* s)
{
assert(s->size);
s->size--;
s->arr[s->size] = NULL;
}
void SLPopFront(SL* s)
{
assert(s->size);
s->arr[0] = NULL;
for (int i = 0; i < s->size; i++)
s->arr[i] = s->arr[i + 1];
s->size--;
}
//指定位置的插入or删除
//在指定位置之前插入数据
void SLInsert(SL* s, int pos, SLDataType x)
{
assert(pos >= 0 && pos <= s->size);
SLCheckCapacity(&s);
for (int i = s->size; i >= pos; i--)
{
s->arr[i] = s->arr[i - 1];
}
s->size++;
s->arr[pos] = x;
}
//删除指定位置的数据
void SLErase(SL* s, int pos)
{
assert(pos >= 0 && pos < s->size);
assert(s->size);
s->arr[pos] = NULL;
for (int i = 0; i < s->size - pos; i++)
{
s->arr[pos + i] = s->arr[pos + i + 1];
}
s->size--;
}
//顺序表的销毁
void SLDestroy(SL* s)
{
free(s->arr);
}
测试 test.c
#include"SeqList.h"
void test1()
{
//定义
SL s1;
//初始化
SLInit(&s1);
Print(s1);
//扩容
SLCheckCapacity(&s1);
Print(s1);
//插入
for (int i = 0; i < 4; i++)
SLPushBack(&s1, i);
for(int j=4;j>0;j--)
SLPushFront(&s1, j);
//SLPushBack(NULL, 10);
Print(s1);
//数据删除
//for (int i = 1; i > 0; i--)
//{
SLPopBack(&s1);
SLPopFront(&s1);
//}
Print(s1);
//指定位置的插入or删除
//在指定位置之前插入数据
SLInsert(&s1, 2, 0);
Print(s1);
//删除指定位置的数据
SLErase(&s1, 5);
//打印
Print(s1);
//销毁
SLDestroy(&s1);
}
int main()
{
test1();
return 0;
}