顺序表的基本操作(删除,插入和查找)


前言

顺序表的基本操作主要有删除,插入和查找


一、插入

代码

#define MaxSize 10
typedef struct{
	int data[MaxSize];
	int length;
}Sqlist;
void Initlist(Sqlist &L){
	for(int i=0;i<MaxSize;i++){
		L.data[i]=0;	//将所有数据元素设置为默认初始值
		L.length=0;	//顺序表初始长度为0
	}
}
bool Insertlist(Sqlist&L,int i,int e){	//在L的位序i处插入元素e
	if(i<1||i>L.length+1)	//判断i的范围是否有效
		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 ture;
	}
}
int main(){
	Sqlist L;
	Initlist(L);
	//此处在顺序表中插入几个元素(略)
	Insertlist(L,3,3);	在位序为3的位置插入3
	return 0;
		
}

时间复杂度

(1)最好情况:在表尾插入(即i=n+1),元素后移语句将不执行,则为O(1);
(2)最坏情况:在表头插入(即i=1),元素后移将执行n次,则为O(n);
(3)平均情况:平均次数为n/2,则为O(n);

二、删除

代码

#define MaxSize 10
#include<stdio.h>
typedef struct{
	int data[MaxSize];
	int length;
}Sqlist;
void Initlist(Sqlist &L){
	for(int i=0;i<MaxSize;i++){
	L.data[i]=0;
	L.length=0;
	}
}
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++){
		L.data[j-1]=L.data[j];
		L.length--;
		return true;
	}
}
int main(){
	Sqlist L;
	Initlist(L);
	//此处省略一些代码,插入几个元素
	int e=-1;	//用变量e把删除的元素“带回来”
	if(ListDelete(L,3,e))
		printf("已删除第3个元素,删除元素值为=%d\n",e);
	else
		printf("位序i不合法,删除失败\n");
	return 0;
}

时间复杂度

(1)最好情况:在表尾删除(即i=n),元素前移语句将不执行,则为O(1);
(2)最坏情况:在表头删除(即i=1),需移动除表头元素以外的所有元素,需循环n-1次,则为O(n);
(3)平均情况:平均次数为n-1/2,则为O(n);

三、查找

按位查找

//GetElem(L,i)  获取位序为i的元素的值
//静态分配情况

#define Maxsize 10
typedef struct{
	ElemType data[Maxsize];
	int length;
}Sqlist;
ElemType Getelem(Sqlist L,int i){
	return(L.data[i-1]);
}

//GetElem(L,i)  获取位序为i的元素的值
//动态分配情况

#define InitSize 10	//顺序表的初始长度
typedef struct{
	ElemType *data;
	int length;
	int MaxSize;
}Seqlist;
ElemType Getelem(Seqlist L,int i){
	return(L.data[i-1]);	//和访问普通数组方法一样
}

时间复杂度

由于顺序表各个数据元素在内存中连续存放,可以根据起始地址和数据元素大小立即找到第i个元素,具有随机存取特性,故为O(1);

按值查找

//LocateElem(L,e)  获取值为e的元素
//动态分配情况

#define InitSize 10	//顺序表的初始长度
typedef struct{
	ElemType *data;
	int length;
	int MaxSize;
}Seqlist;
ElemType LocateElem(Seqlist L,ElemType e){
	for(int i=0;i<L.length;i++)
	if(L.data[i]==e)	
		//==在基本数据类型为int,char,double,float等可以直接运用运算符“==”比较
		//结构类型的数据元素比较方法,即需要依次对比各个分量来判断两个结构体是否相等
	   return i+1;	//数组下标为i的元素值等于e,返回其位序i+1
	return 0;	
}

时间复杂度

(1)最好情况:O(1);
(2)最坏情况:O(n);
(3)平均情况:平均次数为n+1/2,则为O(n);


总结

插入元素时,元素向着表尾方向依次向后移动
删除元素时,元素向着表头方向依次向前移动

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值