什么是顺序表
顺序表在逻辑上是连续的,在物理存储空间上也是连续的。 — 数组
顺序表中存储的数据元素必须从空间的首位置开始存储,而且必须连续存放,中间不能有空的空间。
顺序表的实现声明
// 结构的声明
typedef int DataType;
typedef struct SqList
{
DataType* data; // 指向存储空间的指针
int length; // 已经存储的元素的个数
int size; // 当前空间的大小, 单位是元素个数
}SqList;
// 操作方法的声明
bool InitSqList(SqList *sq, int init_size=10);
bool DestroySqList(SqList *sq);
// 插入一个元素: 按照给定位置插入 插入到最前面(头插法) 插入到最后面(尾插法)
bool InsertOfPos(SqList *sq, DataType value, int pos);
bool InsertOfFront(SqList *sq, DataType value);
bool InsertOfRear(SqList *sq, DataType value);
int LengthSqList(SqList *sq);
方法的实现
/*
内部方法
*/
// static 如果修饰我们函数,则这个函数就只能在本文件中被调用,其他文件看不到此函数
static bool IsFull(SqList *sq)
{
return sq->length == sq->size;
}
static bool AppendSpace(SqList *sq)
{
// 1、申请新的空间
// 2、将原始空间的数据全部导入到新空间中
// 3、释放原空间,sq->data指向新的空间,sq->size同步修改
}
/*
给sq中的三个成员变量设置初始值
*/
bool InitSqList(SqList *sq, int init_size)
{
// 完成安全监测
if (sq == NULL || init_size <= 0) return false;
sq->data = (DataType*)malloc(init_size * sizeof(DataType));
if (sq->data == NULL) return false;
sq->length = 0;
sq->size = init_size;
return true;
}
// 将sq中的三个成员设置假值
bool DestroySqList(SqList *sq)
{
if (sq == NULL) return false;
free(sq->data);
sq->data = NULL; // 防止出现野指针
sq->length = sq->size = 0;
return true;
}
bool InsertOfPos(SqList *sq, DataType value, int pos)
{
// sq pos 空间是否足够
if (sq == NULL) return false;
if (pos < 0 || pos > sq->length) return false;
if (IsFull(sq) && !AppendSpace(sq)) return false;
// 在pos位置插入value值: 1、将pos位置及后面的元素统一向后挪动一个位置 2、在pos位置插入value 3、length同步+1
}
/*头插法就是在0号位置插入*/
bool InsertOfFront(SqList *sq, DataType value)
{
return InsertOfPos(sq, value, 0);
}
/*尾插法就是在当前的length位置插入*/
bool InsertOfRear(SqList *sq, DataType value)
{
if (sq == NULL) return false;
return InsertOfPos(sq, value, sq->length); // 调用函数的过程: 1、压参 2、调用 3、返回
}
int LengthSqList(SqList *sq)
{
if (sq == NULL) return -1;
return sq->length;
}