线性表的顺序实现

线性表的顺序实现

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值