线性表的顺序实现
1、顺序表的结构
顺序表结构中需要的成员:
1、用于存储数据元素的空间位置
2、当前已存储的数据元素的个数 – 记录存储数据的位置3、空间能够存储的元素的总量 – 扩容
4、顺序表存储数据元素时,必须从空间的起始位置开始连续存储
2、顺序表的C语言结构设计
#define DEFAULTSIZE 10
typedef int ElemType;
typedef struct SqList
{
ElemType *data; // 指向用于存储ElemType类型的堆区空间的指针
int length; // 长度: 以存储的属于元素的个数
int size; // 空间的大小,记录的是能够存储的元素个数
}SqList;
typedef bool(*Compare)(ElemType, ElemType); // bool (ElemType,
ElemType)* Compare
// 初始化
void InitSqList(SqList *sq_list, int init_size);
// 销毁
void DestroySqList(SqList *sq_list);
// 插入
/*
1、头插法
2、尾插法
3、按位置插入
*/
bool InsertSqListHead(SqList *sq_list, ElemType value);
bool InsertSqListRear(SqList *sq_list, ElemType value);
bool InsertSqListPos(SqList *sq_list, ElemType value, int pos);
// 删除
/*
1、头删法
2、尾删法
3、按位置删
4、按值删除
*/
bool DeleteSqListHead(SqList *sq_list);
bool DeleteSqListRear(SqList *sq_list);
bool DeleteSqListPos(SqList *sq_list, int pos);
bool DeleteSqListValue(SqList *sq_list, ElemType value);
// 查找 : 返回位置(下标):取值范围 0 -- length-1
int FindSqList(SqList *sq_list, ElemType value, Compare fun);
// 判空
bool Empty(SqList *sq_list);
// 判满
bool Full(SqList *sq_list);
void Show(SqList *sq_list);
3、方法实现
// 如何实现一个函数不能被外部调用
static bool AppendSpace(SqList *sq_list)
{
int new_size = sq_list->size * 2;
ElemType *new_space = (ElemType *)malloc(sizeof(ElemType) *
new_size);
if (new_space == nullptr) return false;
// 挪数据: 将原始空间的数据挪动到新的空间中
for (int i = 0; i < sq_list->size; ++i)
{
new_space[i] = sq_list->data[i];
}
free(sq_list->data);
sq_list->data = new_space;
sq_list->size = new_size;
return true;
}
// 初始化
void InitSqList(SqList *sq_list, int init_size)
{
if (sq_list == nullptr) exit(0);
init_size = init_size > 0 ? init_size : DEFAULTSIZE;
sq_list->data = (ElemType *)malloc(init_size * sizeof(ElemType));
if (sq_list->data == nullptr) exit(0);
sq_list->length = 0;
sq_list->size = init_size;
}
// 销毁
void DestroySqList(SqList *sq_list)
{
if (sq_list == nullptr) exit(0);
free(sq_list->data);
sq_list->data = nullptr;
sq_list->length = sq_list->size = 0;
}
// 插入
/*
1、头插法 0
2、尾插法 length
3、按位置插入 pos
*/
bool InsertSqListHead(SqList *sq_list, ElemType value)
{
return InsertSqListPos(sq_list, value, 0);
}
bool InsertSqListRear(SqList *sq_list, ElemType value)
{
if (sq_list == nullptr) exit(0);
return InsertSqListPos(sq_list, value, sq_list->length); // 函数调
用过程: 先压参, 在调用
}
bool InsertSqListPos(SqList *sq_list, ElemType value, int pos)
{
if (sq_list == nullptr) exit(0);
if (pos < 0 || pos > sq_list->length)
{
printf("Insert Fail: Pos is error\n");
return false;
}
if (Full(sq_list))
{
if (!AppendSpace(sq_list)) // 扩容
{
printf("Insert Fail: Append Space Fail\n");
return false;
}
}
// 挪动pos位置及其之后的数据,统一向后挪动一个位置: 从length - 1向前挪动
for (int i = sq_list->length - 1; i >= pos; --i)
{
sq_list->data[i + 1] = sq_list->data[i];
}
sq_list->data[pos] = value;
sq_list->length++;
return true;
}
// 判满
bool Full(SqList *sq_list)
{
if (sq_list == nullptr) exit(0);
return sq_list->length == sq_list->size;
}
// 判空
bool Empty(SqList *sq_list)
{
if (sq_list == nullptr) exit(0);
return sq_list->length == 0;
}
void Show(SqList *sq_list)
{
if (sq_list == nullptr) exit(0);
printf("%p : ", sq_list->data);
for (int i = 0; i < sq_list->length; ++i)
{
printf("%d ", sq_list->data[i]);
}
printf("\n");
}
// 删除
/*
1、头删法
2、尾删法
3、按位置删
4、按值删除
*/
bool DeleteSqListHead(SqList *sq_list)
{
return DeleteSqListPos(sq_list, 0);
}
bool DeleteSqListRear(SqList *sq_list)
{
if (sq_list == nullptr) exit(0);
return DeleteSqListPos(sq_list, sq_list->length - 1);
}
bool DeleteSqListPos(SqList *sq_list, int pos)
{
if (sq_list == nullptr) exit(0);
if (pos < 0 || pos >= sq_list->length)
{
printf("Delete Fail: Pos is error\n");
return false;
}
if (Empty(sq_list))
{
printf("Delete Fail: SqList is Empty\n");
return false;
}
for (int i = pos; i < sq_list->length - 1; ++i)
{
sq_list->data[i] = sq_list->data[i + 1];
}
sq_list->length--;
return true;
}
// 删除顺序表中所有的value值: 时间复杂度为O(n), 空间复杂度为O(1)
bool DeleteSqListValue(SqList *sq_list, ElemType value)
{
if (sq_list == nullptr) exit(0);
int i = 0, j = 0;
for (; j < sq_list->length; ++j)
{
if (sq_list->data[j] != value)
{
sq_list->data[i] = sq_list->data[j];
i++;
}
}
sq_list->length = i;
return true;
}
int FindSqList(SqList *sq_list, ElemType value, Compare fun)
{
if (sq_list == nullptr) exit(0);
for (int i = 0; i < sq_list->length; ++i)
{
if (fun(value, sq_list->data[i]))
{
return i;
}
}
return -1;
}