实验目的:写出一个程序,可以完成对两个数列的 1、元素删除 2 元素插入 3 数列输出 4 数列合并 5 数列输入等功能
试验步骤:
1、 输入 status initlist(sqlist &L)
2、 插入 status listinsert(sqlist &L, int I ,int e)
3、 删除 status listindele(sqlist &L,int I,int &e)
4、 输出 status listinprint(sqlist L)
5、 合并 void mergelist(sqlist La,sqlist Lb,sqlist &Lc)
等几个函数,实验手工创建两个非递减序列存放于La和
Lb中,并调用MergeList实现数据的合并。
关于程序健壮性的内容:
1、对于插入与删除位置若不合法请给出适当提醒
2、若输入的数据不是非递减排列可通过自己写的
sort()函数排序后再进行后续操作
代码实现:
#include<stdio.h> #include<string.h> #include<algorithm> #define MAX 1000 #define MAXM 10 using namespace std; typedef int Status; bool flag; char a[10]; int Lx[MAX],Ly[MAX],L3[MAX<<1]; int lengtha,wrong,lengthb,n,m,x,k; typedef struct { int *elem; int length;//当前表中元素的个数(肯定小于数组单元的个数) int listsize;//当前顺序表中数组单元的个数 }sqlist; Status initlist(sqlist &L)//创建线性表 { L.elem=(int *)malloc(sizeof(sqlist)*MAX);//=ElemType[MAX]; if(!L.elem) return -1; L.length=0; return 1; } Status listshuru(sqlist &L)//输入数据 { int val; for(int i=0;i<n;i++) { scanf("%d",&val); L.elem[i]=val; L.length++; } return 1; } void paixu(sqlist &L)//排序 { sort(L.elem,L.elem+n); //return 1; } Status panduanrong(sqlist &L)//判断是否需要扩容 { if(L.length>MAX) return -1; else return 1; } Status kuorong(sqlist &L)//进行扩容 { int *newbase=(int *)realloc(L.elem,(L.listsize+MAXM)*sizeof(sqlist));//扩容 if(!newbase) return -1; return 1; } Status listinsert(sqlist &L,int i,int e)//插入数据 { if(i<1||i>L.length+1) return -1; for(int j=L.length-1;j>=i-1;j--) L.elem[j+1]=L.elem[j]; L.elem[i-1]=e; L.length++; return 1; } Status listdele(sqlist &L,int i,int &e)//删除数据 { if(i<1||i>L.length) return -1; int p=i-1;//要被删除的位置 e=p;//记录被删除的位置的值 int q=L.length-1;//表尾元素 for(++p;p<=q;++p) L.elem[p-1]=L.elem[p]; --L.length; return 1; } Status listinprit(sqlist L)//输出数据 { for(int i=0;i<L.length;i++) printf("%d ",L.elem[i]); printf(" "); return 1; } Status listclear(sqlist &L)//清空表 { L.length=0; return 1; } void MergeList()//合并表 { int j=0; for(int i=0;i<lengtha;i++) L3[i]=Lx[i]; for(int i=lengtha;i<lengtha+lengthb;i++) L3[i]=Ly[j++]; } char Y[]={"YES"}; char N[]={"NO"}; void caozuopanduan() { wrong=0; while(!wrong) { scanf("%s",a); if(strcmp(a,Y)!=0&&strcmp(a,N)!=0) printf("您的输入有误,请重新输入 "); else wrong=1; } } Status judgeclear(sqlist &L) { if(L.length==0) return 1; else return -1; } int main() { int k,i,t; printf(" ***********您好,欢迎使用本系统*********** "); printf("1 进行操作请输入 YES 2 退出系统请输入 NO "); caozuopanduan(); system("cls"); t=0; if(a[0]=='Y') { printf("请输入一个n值,代表你要构建的线性表的长度 "); while(scanf("%d",&n)!=EOF) { memset(Lx,0,sizeof(Lx)); memset(Ly,0,sizeof(Ly)); memset(L3,0,sizeof(L3)); system("cls"); for(i=1;i<=2;i++) { sqlist L1; if(initlist(L1)==-1) { printf("线性表构建失败,请重新输入n值 "); continue; } printf("请为L%d输入n个数据 ",i); listshuru(L1); system("cls"); printf("L%d排序后的结果 ",i); paixu(L1); listinprit(L1); //system("cls"); printf("是否执行插入操作,是 请输入YES,不是请输入NO "); caozuopanduan(); system("cls"); if(a[0]=='Y') { printf("请在插入操作前输入您想要插入的位置以及要插入的数 "); int vis=0; flag=false; while(!vis) { scanf("%d%d",&m,&x); system("cls"); if(listinsert(L1,m,x)==-1) printf("您的插入位置不合法,请在数据范围内输入,(注:1<=m<=n) "); else vis=1; if(vis==1) { if(panduanrong(L1)==-1) { printf("若需要扩容输入YES,若不需要扩容输入NO重新进行所有操作,请输入: "); caozuopanduan(); system("cls"); if(a[0]=='Y') { if(kuorong(L1)==-1) { printf("对不起,扩容失败,请重新进行所有操作 "); flag=true; break; } else printf("恭喜您,扩容成功 "); } else { flag=true; break; } } } } if(flag) continue; system("cls"); printf("输出插入后的序列 "); listinprit(L1); } printf("是否执行删除操作,是 请输入YES,不是请输入NO "); caozuopanduan(); system("cls"); if(a[0]=='Y') { printf("再进行删除操作前,请您先输入要删除的位置 "); int b,visb=0; while(!visb) { scanf("%d",&b); system("cls"); if(listdele(L1,b,k)==-1) printf("您的插入位置不合法,请在数据范围内输入,(注:1<=b<=n) "); else visb=1; if(visb==1) { printf("输出删除元素后的序列 "); listinprit(L1); } } } if(i==1) { for(int j=0;j<L1.length;j++) Lx[j]=L1.elem[j]; lengtha=L1.length; } else { for(int j=0;j<L1.length;j++) Ly[j]=L1.elem[j]; lengthb=L1.length; } printf("清空数列线性表 "); listclear(L1); wrong=0; while(!wrong) { if(judgeclear(L1)) { printf("清空成功 "); wrong=1; } else printf("清空失败,我们会为您继续清空 "); } } printf("是否执行合并操作,是 请输入YES,不是请输入NO "); caozuopanduan(); system("cls"); if(a[0]=='Y') { MergeList(); printf("输出合并后的序列 "); for(int j=0;j<lengtha+lengthb;j++) printf("%d ",L3[j]); printf(" "); } printf("已经执行到第%d次,是否继续执行,是 请输入YES,不是请输入NO ",++t); caozuopanduan(); if(a[0]=='N') { if(t>=1) printf("请输入一个n值,代表你要构建的线性表的长度 "); break; } system("cls"); } } return 0; }