顺序表
- 顺序表定义
- 结构体定义
- 初始化
- 扩容函数
- 打印函数
- 尾插和尾删
- 头插和头删
- 查找函数
- 指定位置插入和删除
- 顺序表销毁
顺序表定义
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
顺序表又分为:静态顺序表和动态顺序表。
结构体定义
结构体定义:
//定义变量类型
#define DataType int
#define MAX 100
//顺序表结构声明
静态顺序表
//struct SeqList {
// DataType data[MAX];
// int size;
//};
//动态顺序表
typedef struct SeqList
{
DataType* data;
int size; //顺序表当前大小
int capacity; //容量
}SeqList;
本文主要实现动态结构体
初始化
在使用数据之前,我们需要将数据进行初始化:
//顺序表初始化
void SeqListInit(SeqList* psl)
{
assert(psl);
psl->data = NULL;
psl->capacity = 0;
psl->size = 0;
}
扩容函数
动态顺序表有随时扩容的优点,因此当容量不足时,要能随时扩容
//空间不足,开辟空间
void CheckCapacity(SeqList* psl)
{
//空间满了
if (psl->capacity == psl->size)
{
//首次开辟默认4,以后开辟会多2倍
int newcapacity = psl->capacity == 0 ? 4 : psl->capacity * 2;
DataType* tem = realloc(psl->data, sizeof(DataType) * newcapacity);
if (tem == NULL)
{
//开辟失败,中止程序
printf("开辟空间失败");
//开辟不足直接中止函数
exit(-1);
}
psl->data = tem;
psl->capacity = newcapacity;
}
}
打印函数
为了方便观察代码的逻辑还写了一个打印函数
//打印顺序表
void SeqListPrint(SeqList* psl)
{
//断言的作用:防止传进来的指针为空!
assert(psl);
for (int i = 0; i < psl->size; i++)
{
printf("%d ", psl->data[i]);
}
printf("\n");
}
尾插和尾删
直接在尾部插入和删除数据。
//尾插
void SeqListPushBack(SeqList* psl, DataType x)
{
//断言的作用:防止传进来的指针为空!
assert(psl);
//空间不够开辟空间
CheckCapacity(psl);
psl->data[psl->size] = x;
psl->size++;
}
//尾删
void SeqListPopBack(SeqList* psl)
{
//断言的作用:防止传进来的指针为空!
assert(psl);
assert(psl->size > 0);
psl->size--;
}
头插和头删
在头部插入和删除数据。
//头插
void SeqListPushFront(SeqList* psl, DataType x)
{
//断言的作用:防止传进来的指针为空!
assert(psl);
CheckCapacity(psl);
//尾坐标
int end = psl->size - 1;
while (end >= 0)
{
psl->data[end + 1] = psl->data[end];
end--;
}
psl->data[0] = x;
psl->size++;
}
//头删
void SeqListPopFront(SeqList* psl)
{
//断言的作用:防止传进来的指针为空!
assert(psl);
assert(psl->size > 0);
int end = 1;
while (end < psl->size)
{
psl->data[end - 1] = psl->data[end];
end++;
}
psl->size--;
}
查找函数
按值查找,查找成功返回下标,查找失败返回-1.
//顺序表查找
int SeqListFind(SeqList* psl, DataType x)
{
//成功找到返回下标
for (int i = 0; i < psl->size; i++)
{
if (psl->data[i] == x)
{
return i;
}
}
//找不到返回-1
return -1;
}
指定位置插入和删除
在指定的位置插入和删除数据
//在pos位置插入
void SeqListInsert(SeqList* psl, int pos, DataType x)
{
//断言的作用防止指针为空,防止传进来的pos非法!
assert(psl);
assert(pos >= 0 && pos <= psl->size);
CheckCapacity(psl);
int end = psl->size - 1;
while (end >= pos)
{
psl->data[end + 1] = psl->data[end];
end--;
}
psl->data[pos] = x;
psl->size++;
}
//在pos位置删除
void SeqListErase(SeqList* psl, int pos)
{
//断言的作用防止指针为空,防止传进来的pos非法!
assert(psl);
assert(pos >= 0 && pos < psl->size);
int end = pos + 1;
while (end < psl->size)
{
psl->data[end - 1] = psl->data[end];
end++;
}
psl->size--;
}
顺序表销毁
在使用完之后,要及时销毁顺序表。
//顺序表销毁
void SeqListDestory(SeqList* psl)
{
assert(psl);
free(psl->data);
psl->data = NULL;
psl->size = psl->capacity = 0;
}
以上是顺序表实现的相关接口,如有问题,恳请大佬们指点!💞