顺序表基本操作

顺序表基本操作

顺序表特点:在逻辑上是连续的,在物理空间上也是连续的;在顺序表中存储数据元素,必须从空间的首位置开始存储,连续存放,不能有空的空间。
结构的声明:

typedef int Datatype

typedef struct SqList
{
	Datatype* data//指向存储空间的指针
	int length//存储的元素个数
	int size//空间的大小
	
}SqList;

方法的声明

bool InitSqList(SqList *sq,int init_size)//初始化
bool InsertOfPos(SqList *sq,Datatype value,int pos)//在指定的位置插入
bool InsertOfFront(SqList *sq,Datatype value)//最前面插入
bool InsertOfRear(SqList *sq,Datatype value)//最后面插入
bool DeleteOfPos(SqList *sq,int pos)//指定位置删除
bool DeleteOfFront(SqList *sq)//最前面删除
bool DeleteOfRear(SqList *sq)//最后面删除
bool IsEmptySqlist(SqList *sq)//判空
bool DestroySqList(SqList *sq)//销毁
int LengthSqList(SqList *sq)//元素个数

初始化

bool InitSqList(SqList *sq,int init_size)
{
	if(sq == NULL||init_size < 0)
	return false;
	sq->data = (Datatype*)malloc(sizeof(Datatype)*init_size)//申请空间
	if(sq->data == NULLreturn false;
	sq->length = 0;
	sq->size = init_size;
	return true;
}

插入

bool InsertOfPos(SqList *sq,Datatype value,int pos)
{
	if(sq == NULL)
	return false;
	if(pos < 0||pos > sq->length)
	return false;
	if(IsFull(sq) && !AppendSpace(sq))
	return false;
	//1、将Pos位置及其后面的元素往后移动 2、在pos位置插入value值 3、length++
	for(int i = sq->length;i > pos;i--)
	{
		sq->data[i] = sq->data[i-1];
	}
	sq->data[pos] = value;
	sq->length++;
	return true;
}
//头插
bool InsertOfFront(SqList *sq,Datatype value)
{
	return InsertOfPos(sq,value,0);
}
//尾插
bool InsertOfRear(SqList *sq,Datatype value)
{
	if(sq == NULL)
	return false;
	return InsertOfPos(sq,value,sq->length);
}

判满

static bool IsFull(SqList *sq)
{
	return sq->length == sq->size;
}

扩容

static bool AppendSpace(SqList *sq)
{
	int size = sq->size == 0 ? 10 : sq->size * 2
	Datatype *new_space = (Datatype*)malloc(sizeof(Datatype) * size)
	if(new_space == NULL)
	return false;
	for(int i = 0;i < sq->length;i++)
	{
		new_space[i] = sq->data[i];
	}
	free(sq->data);
	sq->data = new_space;
	sq->size = size;
	return true;
}

判空,销毁

bool DestroySqLIst(SqList *sq)
{
	if(sq == NULL)
	return false;
	free(sq->data);
	sq->data = NULL;
	sq->length = sq->size = 0;
	return true;
}
bool IsEmptySqList(SqList *sq)
{
	if(sq == NULL||sq->length == 0)
	return true;
	return false;
}

删除

bool DeleteOfPos(SqList *sq,int pos)
{
	if(sq == NULL)
	return false;
	if(pos < 0||pos >= sq->length)
	return false;
	//将pos位置后面的值统一向前移动一位
	for(int i=pos;i < sq->length-1;i++)//考虑边界问题
	{
		sq->data[i] = sq->data[i+1];
	}
	sq->length--;
	return true;
}

查找

int Search(SqList *sq,int key)
{
	for(int i=0;i<sq->length;i++)
	{
		if(key == sq->data[i])
		return i;
	}
	return -1;
}

插入算法总结:1、插入位置不合理。抛出异常
2、如果顺序表已满,则异常或者应当动态增加容量
3、将要插入的位置及后面的位置向后移动一位
4、插入value值
5、元素个数加1;
删除算法:1、删除位置不合理,抛出异常
2、取出删除元素
3、将删除位置后面的值统一向前移动一位
4、length–
顺序表:
1、插入数据的时间复杂度O(n),如果尾插时间复杂度为O(1)
2、删除数据的时间复杂度为O(n),尾删时间复杂度为O(1)
3、通过下标访问数据时间复杂度为O(1)
优点:可以快速的存取表中任意位置的元素
缺点:插入和删除操作需要大量移动元素

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值