C++顺序表
**这次顺序表操作包括
“顺序表初始化” “顺序表创建“ ”顺序表插入“ ”顺序表查找“ ”顺序表显示“ ”顺序表删除“ ”顺序表有序合并“;顺序表是c++的一个难点,这次我为大家献上了我的教程。
这也是我的第一篇博客因为本人也是一位大学生,学习时间紧所以不经常发博客,此次老师留作业要做顺序表操作,这次共享望大家支持点赞。
- 下面是整体的代码
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAXSIZE 100
typedef int Status;
typedef int ElemType;
//定义基本结构类型
typedef struct{
ElemType *elem;
ElemType length;
}Sqlist;
int main(){
Sqlist list;
Sqlist list2;
Status CS(Sqlist &L);
void XS(Sqlist &L);
void CJ(Sqlist &L);
void CR(Sqlist &L);
void CZ(Sqlist &L);
void SC(Sqlist &L);
void HB(Sqlist &L,Sqlist &P);
void PX(Sqlist &L);
if(CS(list)==0)cout<<"顺序表1初始化完成"<<endl;
else cout<<"顺序表1初始化失败"<<endl;
if(CS(list2)==0)cout<<"顺序表2初始化完成"<<endl;
else cout<<"顺序表2初始化失败"<<endl;
CJ(list);CR(list);CZ(list);SC(list);HB(list,list2);
}
//初始化顺序表
Status CS(Sqlist &L){
L.elem=new ElemType[MAXSIZE];
if(!L.elem) return OVERFLOW;
L.length=0;
return 0;
}
//创建输入顺序表初始值
void CJ(Sqlist &L){
void XS(Sqlist &L);
ElemType x,y;
cout<<"请输入顺序表的个数:";
cin>>x;
while(x<1||x>MAXSIZE){
cout<<"数据溢出或不合法请重新输入"<<endl;
cin>>x;
}
L.length=x;
for(int i=0;i<x;i++){
cout<<"请输入第"<<i+1<<"个数";
cin>>y;
L.elem[i]=y;
}
XS(L);
}
//顺序表数据显示
void XS(Sqlist &L){
for(int i=0;i<L.length;i++){
cout<<L.elem[i]<<" ";
}
cout<<""<<endl;
}
//给顺序表插入数据
void CR(Sqlist &L){
void XS(Sqlist &L);
int x,y=L.length;
cout<<"请输入要插入的位置:";
cin>>x;
while(x<0||x>L.length+1){
cout<<"输入的位置不合法或溢出请重新输入:";
cin>>x;
}
for(x;x<=y;y--){
L.elem[y]=L.elem[y-1];
}
cout<<"请输入要插入的值";
cin>>y;
L.elem[x-1]=y;
L.length++;
XS(L);
}
//元素的查找
void CZ(Sqlist &L){
int x,i;
cout<<"请输入要查找的值:";
cin>>x;
for(i=0;i<=L.length-1;i++){
if(L.elem[i]==x) break;
}
if(i==L.length) cout<<"没有找到"<<endl;
else cout<<"找到了在第"<<i+1<<"个位置"<<endl;
}
//元素的删除
void SC(Sqlist &L){
void XS(Sqlist &L);
int x;
cout<<"请输入要删除的位置";
cin>> x;
while(x<0||x>L.length){
cout<<"输入的位置不合法或溢出请重新输入:";
cin>>x;
}
for(int i=x;i<=L.length-1;i++){
L.elem[i-1]=L.elem[i];
}
L.length--;
XS(L);
}
//顺序表的毁灭
void HM(Sqlist &L){
if(L.elem) delete[]L.elem;
}
//两个顺序表的有序合并
void HB(Sqlist &L,Sqlist &P){
void CJ(Sqlist &L);
void XS(Sqlist &L);
void PX(Sqlist &L);
cout<<"接下来是顺序表合并"<<endl;
CJ(P);
int i;
if(MAXSIZE-(L.length-1)<(P.length)){
cout<<"list顺序表空间不足以占下list2顺序表";
return;
}
for(i=L.length;i<L.length+P.length;i++){
L.elem[i]=P.elem[i-L.length];
}
L.length=L.length+P.length;
PX(L);
cout<<"合并后的有序值为:";
XS(L);
cin>>i;
}
//顺序表的排序
void PX(Sqlist &L){
void XS(Sqlist &L);
int x;
for(int i=0;i<(L.length-2);i++){
for(int j=0;j<=L.length-2-i;j++){
if(L.elem[j]>L.elem[j+1]) x=L.elem[j],L.elem[j]=L.elem[j+1],L.elem[j+1]=x;
}
}
}
- 接下来分开解释
//首先定义顺序表的存储类型
typedef struct{
ElemType *elem;
ElemType length;
}Sqlist;
定义了顺序表的基本类型其中ElemType类型是类型名int的重定义;
- 初始化顺序表
Status CS(Sqlist &L){
L.elem=new ElemType[MAXSIZE];
if(!L.elem) return OVERFLOW;
L.length=0;
return 0;
}
通过主函数传入顺序表list来定义动态数组L.length为数组的元素个数L.elem[]为顺序表元素.
- 输入顺序表初始值
void CJ(Sqlist &L){
void XS(Sqlist &L);
ElemType x,y;
cout<<"请输入顺序表的个数:";
cin>>x;
while(x<1||x>MAXSIZE){
cout<<"数据溢出或不合法请重新输入"<<endl;
cin>>x;
}
L.length=x;
for(int i=0;i<x;i++){
cout<<"请输入第"<<i+1<<"个数";
cin>>y;
L.elem[i]=y;
}
XS(L);
}
以上就是输入顺序表中的元素
- 顺序表的显示
void XS(Sqlist &L){
for(int i=0;i<L.length;i++){
cout<<L.elem[i]<<" ";
}
cout<<""<<endl;
}
这段代码就会被多次执行所以几乎在每段代码中都会声明函数
- 顺序表插入元素
void CR(Sqlist &L){
void XS(Sqlist &L);
int x,y=L.length;
cout<<"请输入要插入的位置:";
cin>>x;
while(x<0||x>L.length+1){
cout<<"输入的位置不合法或溢出请重新输入:";
cin>>x;
}
for(x;x<=y;y--){
L.elem[y]=L.elem[y-1];
}
cout<<"请输入要插入的值";
cin>>y;
L.elem[x-1]=y;
L.length++;
XS(L);
}
输入位置和值,如果输入的位置不在数组的范围内要重输,然后输入的位置后面的元素依次向后移一个元素给插入的元素留出位置。
- 顺序表元素的查找
void CZ(Sqlist &L){
int x,i;
cout<<"请输入要查找的值:";
cin>>x;
for(i=0;i<=L.length-1;i++){
if(L.elem[i]==x) break;
}
if(i==L.length) cout<<"没有找到"<<endl;
else cout<<"找到了在第"<<i+1<<"个位置"<<endl;
}
依次遍历各元素与要查找的元素比对相同则停止查找并输出其位置。
- 顺序表元素的删除
void SC(Sqlist &L){
void XS(Sqlist &L);
int x;
cout<<"请输入要删除的位置";
cin>> x;
while(x<0||x>L.length){
cout<<"输入的位置不合法或溢出请重新输入:";
cin>>x;
}
for(int i=x;i<=L.length-1;i++){
L.elem[i-1]=L.elem[i];
}
L.length--;
XS(L);
}
输入要删除的位置则将此位置后的元素依次向前移一个位置来达到覆盖此元素;而后数组个数减一。
- 两个顺序表合并
void HB(Sqlist &L,Sqlist &P){
void CJ(Sqlist &L);
void XS(Sqlist &L);
void PX(Sqlist &L);
cout<<"接下来是顺序表合并";
CJ(P);
int i;
if(MAXSIZE-(L.length-1)<(P.length)){
cout<<"list顺序表空间不足以占下list2顺序表";
return;
}
for(i=L.length;i<L.length+P.length;i++){
L.elem[i]=P.elem[i-L.length];
}
L.length=L.length+P.length;
PX(L);
cout<<"合并后的有序值为:";
XS(L);
cin>>i;
}
//链表的排序
void PX(Sqlist &L){
void XS(Sqlist &L);
int x;
for(int i=0;i<(L.length-2);i++){
for(int j=0;j<=L.length-2-i;j++){
if(L.elem[j]>L.elem[j+1]) x=L.elem[j],L.elem[j]=L.elem[j+1],L.elem[j+1]=x;
}
}
}
首先输入新的顺序表,然后从原顺序表后面依次追加新顺序表的元素,最后进行排序,理解简单。
顺序表不仅是c++的重点也是数据结构的重点,当今时代已不缺人才,缺的是基础的扎实性,越来越多的公司企业面试时会更多的问一些基础性的知识,学好基础成了重中之重,希望大家学好当下语言的同时,更多的关注数据结构这个科目。