C++实现顺序表的基本操作

C++实现顺序表的基本操作

为了对数据结构线性表中的顺序表进行练习,我写了一段可以实现顺序表创建、插入、删除、排序、打印等基本操作的代码。

#include<iostream>
#include<algorithm>
using namespace std;
#define MAXSIZE 1000 
#define OVERFLOW -2
#define ERROR 1
typedef int ElemType;
typedef int Status;

//顺序表的建立:定义了一个名为SqList的结构体 
 typedef struct{
 	ElemType *elem;
// 	存储空间的基地址
int length;
//当前长度 
 }SqList;
 
// 顺序表的初始化
void InitList(SqList &L){
	L.elem = new ElemType[MAXSIZE];
//	构造一个新的顺序表L 并为之分配大小为MAXSIZE的空间
if(L.elem == NULL){
	cout<<"存储空间分配失败!"<<endl;
	 exit(OVERFLOW);
}
// 存储空间分配失败退出
L.length = 0;
cout<<"顺序表初始化完成"<<endl; 
} 

//顺序表读入值
void Create(SqList &L,int n,ElemType e){
	for(int i = 0;i<n;i++){
		ElemType e;
		cin>>e;
		L.elem[i] = e;
		L.length++;
	}
} 

//顺序表插入值
int Insert(SqList &L,int i,ElemType e){
	cout<<"请输入要插入的元素及其插的位置"<<endl;
    cin>>e>>i;
    
	if((i<1)||(i>L.length+1))
{
		cout<<"插入地址不合法"<<endl;
	return ERROR;
}
 
    if(L.length == MAXSIZE)
    {
    	cout<<"存储空间已满"<<endl;
		return ERROR;
	} 
    
    for(int j = L.length-1;j>=i-1;j--){
    	L.elem[j+1] = L.elem[j];
	}
//	以上是从后比较的方法 可以边比较边移动
	L.elem[i-1] = e;
    ++L.length;
} 

int Delete(SqList &L,int i){
	cout<<"请输入要删除的元素的位置"<<endl;
	cin>>i;
	
	if((i<1)||(i>L.length))
	{
		cout<<"删除地址不合法"<<endl;
		return ERROR;
	}
	 
	for(int j = i;j<=L.length;j++){
		L.elem[j-1] = L.elem[j];
	}
	--L.length;
}

int Print(SqList L)
{
    if (L.length == 0)
    {
        return 1;
    }
    for (int k = 0; k < L.length; k++)
    {
    	if(k == L.length-1)
    	{
    		cout<<L.elem[k];
		}
		else{
			cout<<L.elem[k]<<' ';
		}
    }
}

void Sort(SqList L){
	sort(L.elem , L.elem + L.length);
} 


int main(){
	int n , x;
	cout<<"请输入n值"<<endl;
	cin>>n;
//	输入数组的长度n
 
    SqList L;
	ElemType e;
//	在主函数中进行声明
    InitList(L);
//    顺序表的初始化 
 loop:
	cout<<"请选择您想进行的操作"<<endl;
	cout<<"0.给顺序表读入值"<<endl;
	cout<<"1.给顺序表插入值"<<endl;
	cout<<"2.给顺序表删除值"<<endl;
	cout<<"3.给顺序表排序"<<endl;
	cout<<"4.输出顺序表"<<endl;
	
	cin>>x;
	
	switch(x){
		case 0:{
			cout<<"请输入数组的各个元素"<<endl;
			Create(L , n , e);
			cout<<"退出请按1,输入其他数字返回上级清单"<<endl;
			int p;
			cin>>p;
			if(p == 1){
			return 0;
			}
			else{
			goto loop;	
			} 	
		break;
		}
		
		case 1:{
			int i;
			Insert(L , i , e);
			cout<<"插入之后的数组"<<endl;
			Print(L);
			cout<<"退出请按1,输入其他数字返回上级清单"<<endl;
			int p;
			cin>>p;
			if(p == 1){
		    return 0;
			}
			else{
			goto loop;	
			} 	
		break;
		}
		
		case 2:{
			int i;
			Delete(L , i);
			cout<<"删除之后的数组:"<<endl;
			Print(L);
		cout<<"退出请按1,输入其他数字返回上级清单"<<endl;
			int p;
			cin>>p;
			if(p == 1){
			return 0; 
			}
			else{
			goto loop;	
			} 	
		break;
		}
		
		case 3:{
		    Sort(L);
			Print(L);
			cout<<"退出请按1,输入其他数字返回上级清单"<<endl;
			int p;
			cin>>p;
			if(p == 1){
			return 0;
			}
			else{
			goto loop;	
			} 	
			break;
		}
		
		case 4:{
			Print(L);
		cout<<"退出请按1,输入其他数字返回上级清单"<<endl;
			int p;
			cin>>p;
			if(p == 1){
			return 0;
			}
			else{
			goto loop;	
			} 	
		break;
		}
		
		default : {
		cout<<"请输入正确的数字!"<<endl;
		goto loop;
			break;
		}
	}
	return 0;  
}

相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付 9.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值