数据结构(c/c++):1.线性表之顺序表代码实现

结构体:
typedef struct{
ElemType data[maxSize];
int length;
}Sqlist;
顺序表的操作主要为插入和删除,这两个理解了其他基本操作也就没什么问题了

  • 插入:

x为待插元素,p为待插位置
插入思想:
1.先判断插的位置合不合理,能不能插
(代码中p>L.length而不是length-1是为了可以在线性表末插入,L.length==maxSize确保不会发生越界)
2.要想在p位置插入,则必须p后的每个元素都向后移一位,若从p开始移动会发生元素丢失,所以应该从最后一个元素开始移
for循环让L.data[i+1]=L.data[i];最后再L.data[p]=x;最后(L.length)++;

int insertElem(Sqlist &L,int x,int p){
	if(p<0||p>L.length||L.length==maxSize){
	return 0;
	}
	for(int i=L.length-1;i>=p;i--)
	L.data[i+1]=L.data[i];
	L.data[p]=x;
	(L.length)++;
	cout<<"insert sucess!"<<endl;
	return 1;
	}
  • 删除(取出):
    p为待删除位置,e用来接收删除的元素
    删除思想:
    1.先判断删的位置合不合理,能不能插
    (在findElem函数判定)
    2.想删除p位置的元素,则要p后的元素都像前移动一位置,从p后一个位置开始移动才不会发生元素丢失
    for循环从p开始L.data[i]=L.data[i+1];最后记得(L.length)–;
int deleteElem(Sqlist &L,int p,int &e){
	if(!findElem(L,p,e))  return 0;
	for(int i=p;i<L.length-1;i++){
		L.data[i]=L.data[i+1];
	}
	(L.length)--;
	return 1;

}
int findElem(Sqlist &L,int p,int &e){
	if(p<0||p>L.length-1) return 0;
	e=L.data[p];
	return 1;
	} 
 

线性表完整的代码如下

#include <iostream>
#include<cstring>
#define maxSize 100
typedef int ElemType;

using namespace std;
typedef struct{
	ElemType data[maxSize];
	int length;
}Sqlist;
//菜单 
void menu(){
	cout<<endl;
	cout<<"输入1插入元素"<<endl; 
	cout<<"输入2删除指定位置的元素"<<endl; 
	cout<<"输入3查找指定位置的元素"<<endl; 
	cout<<"输入4退出"<<endl; 

}
//根据输入建顺序表 
bool creatSq(Sqlist &L){
	int i=0,n=0;
	int a;
	cout<<"建表,请输入元素个数"<<endl;
	cin>>n;
	
	while(n>0){

		if(L.length==maxSize){
			
			return false;
		}
		else{
			
			cin>>a;
			L.data[i++]=a;
			(L.length)++;
			n--;
		}
	
		}
		return true;
		
	}


//显示 
void show(Sqlist L){
	int j=L.length;
	cout<<"当前顺序表为:"<<"   "; 
	for(int i=0;i<j;i++){
	cout<<L.data[i]<<" ";
	
	}
	cout<<endl;
}	
//插入元素x在表中第P位置 
int insertElem(Sqlist &L,int x,int p){
	if(p<0||p>L.length||L.length==maxSize){
	return 0;
	}
	for(int i=L.length-1;i>=p;i--)
	L.data[i+1]=L.data[i];
	L.data[p]=x;
	(L.length)++;
	cout<<"insert sucess!"<<endl;
	return 1;
	}

//查找某个位置的元素 
int findElem(Sqlist &L,int p,int &e){
	if(p<0||p>L.length-1) return 0;
	e=L.data[p];
	return 1;
	} 
 
int deleteElem(Sqlist &L,int p,int &e){
	if(!findElem(L,p,e))  return 0;
	for(int i=p;i<L.length-1;i++){
		L.data[i]=L.data[i+1];
	}
	(L.length)--;
	return 1;

} 

int main(){
	Sqlist L;
	memset(L.data, 0, sizeof(L));//初始化数据为0
	L.length = 0;                //初始化长度为0
	if(!creatSq(L)){ cout<<"error"<<endl;return 0;}
	cout<<"creat sucess!"<<endl; 
	show(L);
	int choice;
	while(1){
		menu();
		cin>>choice;
		switch(choice){
			case 1: {int x,p;
					cout<<"输入插入的元素和位置"<<endl;
					cin>>x>>p;
					if(!insertElem(L,x,p)) {cout<<"插入失败"<<endl;break;}
					show(L);
					break;} 
			case 2: {int p,e=0;
					cout<<"输入删除的位置"<<endl;
					cin>>p;
				    if(!deleteElem(L,p,e)) {cout<<"删除失败"<<endl; show(L);break;}
					cout<<"第"<<p<<"位置元素: "<<e<<"已经删除"<<endl;
					show(L);
					break;} 
			case 3: {int p,e=0;
					cout<<"输入查找的位置"<<endl;
					cin>>p;
					if(!findElem(L,p,e)) {cout<<"查找失败"<<endl;break;}
					cout<<"该位置元素为: "<<e<<endl;
					break;} 
			case 4: return 0;
			default: break;
			
		}
		
		

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值