2021-05-10

顺序表的基本操作:

一下代码展示的是顺序表的 插入删除查找操作以及时间复杂度的分析和一些注释

1.顺序表的插入操作

bool ListInsert(SqList &L,int L,int e)  //顺序表的插入操作 
{	

	if(i<1||i>L.length+1)
	return false;
	if(L.length>=MaxSize)  //存储空间满了  不能插入 
	return false;
	for(int j=L.length;j>=i;j--)//将第i个元素和后面的元素后移 
	{
		L.data[j]=L.data[j-1];
		L.data[i-1]=e;//在位置i处放入e 
		L.length++;// 长度加1
		return true; 
	}
	int place;
	ElemType e;//使用ElemTyoe 是因为插入的数据类型不知道是哪一种 
	printf("请输入要插入的位置(从1开始)和元素:\n"); 
	scanf("%d %d",&place,&e);
	bool flag;  
		if (flag)
	{
		printf("插入成功!!!\n");
		PrintList(L);
	} 
}
/* 对时间复杂度的分析 
	最好情况 插入在顺序表的表尾
	时间复杂度为=O(1)
	最坏情况  插入在顺序表的表头
	时间复杂度为=O(n)
	平均情况:假设目标元素出现在任何一个位置的概率都相同,都是1/n+1 
	假设i=1  循环n次;i=2时循环n-1次;i=n+1时循环0次
	平均时间复杂度=np+(n-1)p+(n-2)p+...+1p=n/2 
*/

2.顺序表的删除操作

bool ListDelete(SqList &L,int i,int  &e) //顺序表的删除功能 
{
	if(i<1||i>L.length)//判断插入的元素是否有效 
	return false;
	e=L.data[i-1];   //将被删除的元素赋值给e 
	for(int j=i;j<L.length;j++)  //for循环 是将第i个位置后的元素前移 
	{
		L.data[j-1]=L.data[j];
		L.length--;     //线性表的长度减1
		 
		
	}return true;
	int e=-1;

	scanf("%d",&i); 
	if(ListDelete(L,i,e))
		printf("已删除第i个元素,删除的元素值为=%d\n",e);
		else
		printf("位序i不合法 删除失败");
 } 
 /*  时间复杂度分析
 		最好情况删除的表尾元素,其他的元素不用移动
		 时间复杂度为O(1)
		 最坏情况 删除的表头元素,其他元素都得移动
		 时间复杂度为O(n)
	平均情况:假设目标元素出现在任何一个位置的概率都相同,都是1/n
	i=1 循环n-1次;i=2时循环n-2次 i=n时 循环0次
	平均循环=(n-1)p+(n-2)p+...+p=(n-1)/2 
 */

3.顺序表的查找操作

bool LocateElem(SqList L, ElemType e)
	
{	
	if(i<1||i>MaxSize)
	 return false;
	for (int i = 0; i<L.length; i++)//从低位置查找
	{
		if (L.data[i] == e)
			return i + 1;	//数组下表为i的元素值为e 返回其位序i+1 
	}
	return 0;		//退出循环  说明查找失败 
}
//查找函数对时间复杂度的分析
/*  最好情况:目标元素在表头
	循环一次 最好的时间复杂度=O(1)
	最坏情况:目标元素在表尾
	循环n次:最坏时间复杂度=O(n)
	平均情况:假设目标元素出现在任何一个位置的概率都相同,都是1/n
	目标元素在第一位 循环1次 第二位循环2次  第n位循环n次
	平均循环次数=1*1/n+2*1/n+...+n*1/n=(n+1)/2 
*/ 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值