C++实现顺序表操作

在C++中,顺序表是一个线性表的一种实现方式。它是一种可以按照元素在内存中的物理顺序依次存储的数据结构。顺序表在内存中是连续的,可以通过下标来直接访问元素。

C++中的顺序表可以使用数组来实现。数组是一种固定大小的连续内存块,可以通过索引访问元素。在C++中,可以使用普通数组或者动态数组来实现顺序表。

普通数组是在编译时指定大小的数组,大小在运行时不能改变。可以使用下标来访问数组中的元素,通过将元素插入或删除来实现顺序表的操作。使用普通数组实现的顺序表的优点是访问速度快,缺点是大小固定,不能动态调整。

动态数组是使用关键字new在堆上分配内存的数组,大小可以在运行时动态调整。可以使用指针来访问动态数组中的元素,通过重新分配内存来实现顺序表的操作。使用动态数组实现的顺序表的优点是可以动态调整大小,缺点是访问速度相对较慢。

除了数组,还可以使用链表来实现顺序表。链表是一种非连续的数据结构,在C++中可以使用指针实现。链表中的每个节点都包含一个元素和指向下一个节点的指针。通过遍历链表来访问元素,通过插入或删除节点来实现顺序表的操作。链表实现的顺序表的优点是可以动态调整大小,缺点是访问速度相对较慢。

如下是一段用数组实现顺序表的过程

这段 C++代码实现了顺序表的初始化、插入、打印、置空、销毁、查找、删除、排序以及求并集、交集和差集等操作,并通过在主函数中对两个顺序表进行一系列操作来展示这些功能,最后还实现了在并集中查找特定元素的功能,并在结束时销毁了所有顺序表。

#include<bits/stdc++.h>//万能头文件
using namespace std;//命名空间

#define MAXSIZE 100 //最大长度
#define OVERFLOw -2
#define OK 1
#define ERROR 0

typedef int Status;
typedef char eleType;//数据类型

typedef struct{
	eleType *elements;
	int length;
}SqList;//定义顺序表

//顺序表的初始化
Status SqListInit(SqList &L){
	L.elements = new eleType[MAXSIZE];
	if(!L.elements) exit(OVERFLOw);
	L.length = 0;//长度为0
	return OK;//创建完毕
}
//顺序表的插入数据
Status SqListInsert(SqList &L,int i,eleType e){
	int j;
	if(i<1||i>L.length+1) return ERROR;//插入不合法
	if(i==MAXSIZE) return ERROR;//顺序表满了
	for ( j=L.length-1 ; j>=i-1; j--) {
		//逐个元素右移
		L.elements[j+1] = L.elements[j] ;
	}
	L.elements[i-1] = e ;   //插入e 
	L.length++;//L的长度加1
	return OK; //插入成功
}
//顺序表的打印
void SqListPrint(SqList &L){
	for(int i = 0;i<L.length;i++){
		cout<<L.elements[i]<<"\t";
	}
	cout<<endl;
}
//顺序表的置空
Status SqListEmpty(SqList &L){
	L.length = 0;
	L.elements = NULL;
	return OK;
}
//顺序表的销毁
void SqListDestroy(SqList &L){
	//判断是否为空
	if(L.elements){
		delete[]L.elements;//销毁空间
		L.length = 0;//长度为0
		L.elements=NULL;//置空
	}
}
//顺序表的查找
Status SqListFind(SqList &L,eleType e){
	for(int i  =0 ;i<L.length;i++){
		if(L.elements[i]==e){
			return i+1;//第几个出现,消除索引偏移
		}
	}
	return 0;
}
//顺序表元素删除
Status SqListDelete(SqList &L,int i){
	int j;
	if ((i <1) || (i > L.length)) return ERROR;   // 删除位置不合法
	for (j=i;j<=L.length-1; j++)
		L.elements[j-1]=L.elements[j]; // 被删除元素之后的元素前移
	L.length--;   //表长减 1
	return OK;
}

//顺序表排序
Status SqListSort(SqList &L){
	sort(L.elements,L.elements+L.length);
	return OK;
}

//顺序表并集(有序)
SqList SqListMerge(SqList &L1,SqList &L2){
	int i=0,j=0,t=1;
	SqList L3;//用来接收L1 L2的合集
	SqListInit(L3);//⭐初始化L3用来接收
	int preValue = -1;//防止最后存入剩余元素那一步元素重复
	while(i<L1.length&&j<L2.length){
		if(L1.elements[i]==L2.elements[j]){
			if(preValue!=L1.elements[i]){
				preValue=L1.elements[i];
				SqListInsert(L3,t++,L1.elements[i]);
				
			}i++;j++;//存入相对较小元素后对应坐标加1 
		}else if(L1.elements[i]<L2.elements[j]){
			if(preValue!=L1.elements[i]){
				preValue=L1.elements[i];
				SqListInsert(L3,t++,L1.elements[i]);
			}	i++;
		}else {
			if(preValue!=L2.elements[j]){
				preValue=L2.elements[j];
				SqListInsert(L3,t++,L2.elements[j]);
				
			}j++;
		}
	}
	//L1还有剩余
	while(i<L1.length){
		if(preValue!=L1.elements[i]){
			preValue=L1.elements[i];
			SqListInsert(L3,t++,L1.elements[i]);
			
		}i++;
	}
	//L2还有剩余
	while(j<L2.length){
		if(preValue!=L2.elements[j]){
			preValue=L2.elements[j];
			SqListInsert(L3,t++,L2.elements[j]);
		}
		j++;	
	}
	return L3;
}
//顺序表的交集(有序)
SqList SqListInserSection(SqList &L1,SqList &L2){
	SqList L4;
	SqListInit(L4);
	int i = 0,j = 0, t = 1;
	int preValue = -1;//防止最后存入剩余元素那一步元素重复
	while(i<L1.length&&j<L2.length){
		if(L1.elements[i]==L2.elements[j]){
			if(preValue!=L1.elements[i]){
				preValue=L1.elements[i];
				SqListInsert(L4,t++,L1.elements[i]);
			}i++;j++;//存入相对较小元素后对应坐标加1 
		}else if(L1.elements[i]<L2.elements[j]){
			i++;
		}else {
			j++;
		}
	}
	return L4;
}
//顺序表的差
SqList SqListDiff(SqList &L1,SqList &L2){
	SqList L5;
	SqListInit(L5);
	int i = 0,j = 0, t = 1;
	while(i<L1.length&&j<L2.length){
		if(L1.elements[i]==L2.elements[j]){
			i++;j++;
		}else if(L1.elements[i]<L2.elements[j]){
			SqListInsert(L5,t++,L1.elements[i++]);
		}else {
			j++;
		}
	}
	while(i<L1.length){
		SqListInsert(L5,t++,L1.elements[i++]);
	}
	return L5;
}
int main(){
	//L
	SqList L1;
	SqListInit(L1);
	for(int i =1;i<=10;i++){
		int x = 0-i+10+97;
		SqListInsert(L1,i,x);
	}
	cout<<"L1:  "<<endl;
	SqListPrint(L1);
	//L2
	SqList L2;
	SqListInit(L2);
	for(int i =1;i<=10;i++){
		int x = 0-i+15+97;
		SqListInsert(L2,i,x);
	}
	cout<<"L2:  "<<endl;
	SqListPrint(L2);
	
	cout<<"L1排序后:"<<endl;
	SqListSort(L1);
	SqListPrint(L1);
	
	cout<<"L2排序后:"<<endl;
	SqListSort(L2);
	SqListPrint(L2);
	
	
	cout<<"L2排序后与L1排序后合集 L3"<<endl;
	SqList L3 = SqListMerge(L1,L2);
	SqListPrint(L3);
	
	cout<<"L2排序后与L1排序后交集 L4"<<endl;
	SqList L4 = SqListInserSection(L1,L2);
	SqListPrint(L4);
	
	cout<<"L1 - L2 = L5"<<endl;
	SqList L5 = SqListDiff(L1,L2);
	SqListPrint(L5);
	
	cout<<"L2 - L1 = L6"<<endl;
	SqList L6 = SqListDiff(L2,L1);
	SqListPrint(L6);
	
	int goal;
	cout<<"请输入要在合集L3中查找的数字:"<<endl;
	cin>>goal;
	if(SqListFind(L3,goal)!=0){
		cout<<goal<<"在第"<<SqListFind(L3,goal)<<"个出现"<<endl;
	}else{
		cout<<goal<<"未在L3中出现"<<endl;
	}

	
	SqListDestroy(L1);
	SqListDestroy(L2);
	SqListDestroy(L3);
	SqListDestroy(L4);
	SqListDestroy(L5);
	SqListDestroy(L6);
	return 0;
}

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值