顺序表基本运算

虽然感觉顺序表稍微有一点麻烦,但是它的优点还是显而易见的:
一是存储密度大:不像链表那样需要额外开辟一个指针域空间;
二是具有随机存取特性:可以通过下标直接访问某个数据,与存储位置无关。(PS.刚开始的时候不是太理解随机存取的意思,后来一想随机不就是在数组中任意的存储嘛,只要存储空间够大,可以存在任意的位置,取数据的时候只要根据地址来取就行了(我真的很笨😭))。
当然,缺点也是不可避免的:
一是插入和删除某个数据时需要移动大量的元素,本篇将为大家进行演示;
二是初始空间的大小不太好分配。

Now,let’s get started.
1.初始化线性表

void InitList(SqList *&L)
{
	L=(SqList*)malloc(sizeof(SqList));
	L->length=0;
}

2.销毁线性表

void DestroyList(SqList *&L)
{
	free(L);
}

3.判断是否为空表

bool EmptyList(SqList *L)
{
	return (L->length==0);
}

4.求线性表的长度

void ListLength(SqList *L)
{
	return L->length;
}

5.输出线性表

void PrintList(SqList *L)
{
	if(EmptyList(L))
		return;
	for(int i=0;i<L->length;i++)
		printf("%-3d",L->data[i]);
}

6.按元素值查找

查找第一个与x相等的元素的逻辑位置,若不存在这一元素,则返回零

int FindList(SqList *L,int x)
{
	int i=0;
	while(i<L->length&&L->data[i]!=x)
		i++;
	if(i<L->length)
		return i+1;
	else
		return 0;
}

7.插入数据元素
重磅来啦,插入和删除函数是线性表顺序存储结构的重点。

void Insert(SqList *&L, int x, int i)//x代表要插入元素,i代表插入位置
{
	if (i<1 || i>L->length + 1)//检测插入位置是否符合
		return;
	int j;
	for (j = L->length; j > i - 1; j--)
		L->data[j] = L->data[j - 1];
	L->data[i - 1] = x;
	L->length += 1;//切记最后长度要增加1

该算法元素移动次数与L->length和插入位置有关。当i=L->length时,移动次数最少,为0;当i=1时,移动次数最多,为L->length。
因此,时间复杂度最好为O(1),最坏为O(n)。平均时间复杂度为O(n)。

8.删除数据元素

void Delete(SqList *&L, int i)//i代表删除位置
{
	if (i<1 || i>L->length)//检查删除位置是否正确
		return;
	int j;
	for (j = i - 1; j < L->length; j++)
		L->data[j] = L->data[j + 1];
	L->length--;//最后长度减1
}

平均时间复杂度分析与插入元素函数类似,不再赘述。

博客内容浅显,如有错误,欢迎大家指正!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值