数据结构——顺序表概念和操作

记录一下(插入,删除,查找)

注意点:位序 i 的值是从1开始的,而数据n是从 0 开始计数的。

时间复杂度:

插入:最好情况:表尾插入:O(1)

           最坏情况:表头插入:O(n)

           平均情况:执行n/2次,O(n)

删除:最好情况:表尾删除:O(1)

           最坏情况:表头删除:O(n)

           平均情况:执行(n-1)/2次,O(n)

按值查找:最好情况:表头查找:O(1)

                  最坏情况:表尾查找:O(n)

                  平均情况:执行(n+1)/2次,O(n)

           


#include<stdio.h>
#include<stdlib.h>
#define Maxsize 50


typedef struct{
	int data[Maxsize];  //顺序表中的元素 
	int length;   // 顺序表长度 
}SqList;

/*-----------插入函数----------*/ 
//在顺序表的第i个位置插入新元素e ,i后元素后移操作 

bool List_insert(SqList &L,int i,int e)
{	
//	if (i<1 || i>L.length+1){
//	printf("插入失败,插入位置不合法\n");
//	return false;
//	}
//	
//	if (L.length >= Maxsize){
//	printf("插入失败,顺序表已满\n");
//	return false;
//	}
//	@@@@@@@@将判定条件前移放入main函数里面了 

	for (int j=L.length;j>=i;j--){
		L.data[j] = L.data[j-1];
	}
	L.data[i-1] = e;
	L.length++;
	return true;	
} 
/*-----------删除函数-----------*/
bool List_delete(SqList &L,int i,int &e){//直接赋值将第i个数赋值给e 
	e = L.data[i-1];//注意下标位置是从1开始的
	for (int j = i;j < L.length; j++ ){
		L.data[i-1] = L.data[i];//i后元素前移一位 
	}
	L.length--;
	return true; 
}


/*-----------查找函数(按值查找,return its location)-----------*/
int List_find(SqList &L,int e){
	int i;
	for (i = 0;i <= L.length;i++){
		if(L.data[i]==e){
			return i+1;
		}			
	}
	return 0;
}


/*-----------查找函数(按位i查找,return its location)-----------*/
int List_search(SqList &L,int i){
	
		return L.data[i-1];
		
}


/*-----------输出函数-----------*/
bool Sqlist_display(SqList L){
	int j;	
	for (j=0;j<=L.length-1;j++)
		printf("%4d",L.data[j]);
	printf("\n");
}


/*-----------主函数-----------*/
int main(){
	SqList L;
	int i,x,j;
	printf("\n请输入顺序表长度:");
	scanf("%d",&L.length);
	
	printf("请输入顺序表元素:\n");
	for (j=0;j<=L.length-1;j++){
		scanf("%d",&L.data[j]);
	}
	
	printf("*******************************\n");
	printf("请输入您要进行的操作:\n");
	printf("1.插入元素\n");
	printf("2.删除元素        3.按值查找元素\n");
	printf("4.按位查找元素\n");
	printf("*******************************\n");
	printf("实现操作:");
	scanf("%d",&i);

	switch (i)
	{
		
	case 1:
		printf("请输入插入操作位置:");
		scanf("%d",&i);
	
		if (i<1 || i>L.length+1){
			
			printf("插入失败,插入位置不合法\n");
			return false;		
		}
	
		if (L.length >= Maxsize){
		printf("插入失败,顺序表已满\n");
		return false;
		} //直接将插入条件判定移到输入插入位置之后 
	
		printf("请输入需要插入的新元素:");
		scanf("%d",&x);
		List_insert(L,i,x);
		Sqlist_display(L);
		break;

	case 2:		
		printf("请输入删除操作位置:");
		scanf("%d",&i);
		if (i<1 || i>L.length){			
			printf("失败,位置不合法\n");
			return false;		
		}	
		if (L.length >= Maxsize){
			printf("失败,顺序表已满\n");
			return false;
		} 
		List_delete(L,i,x);
		Sqlist_display(L);
		break;
		
	case 3:
		printf("请输入要查找的元素:");
		scanf("%d",&x);
		if(List_find(L,x)){
			printf("find success!!查找元素在第%d位\n",List_find(L,x));
		}
		else{
			printf("find false!!\n");
		}
		break;
		
	case 4:
		printf("输入查找位序:");
		scanf("%d",&i) ;
		if(i>0&&i<=L.length){
			printf("find success!!查找元素是%d\n",List_search(L,i));
		}
		else{
			printf("find false!!,the location you input exceeds the range!\n");
		}
		break;
	
	default:
		printf("没有这一步操作\n");
		break;
	}
	
//	system("pause");
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值