实验目的:写出一个程序,可以完成对两个数列的 1、元素删除 2 元素插入 3 数列输出 4 数列合并 5 数列输入等功能
#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("\n");
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("您的输入有误,请重新输入\n");
else
wrong=1;
}
}
Status judgeclear(sqlist &L)
{
if(L.length==0)
return 1;
else
return -1;
}
int main()
{
int k,i,t;
printf(" ***********您好,欢迎使用本系统***********\n\n");
printf("1 进行操作请输入 YES\n2 退出系统请输入 NO\n");
caozuopanduan();
system("cls");
t=0;
if(a[0]=='Y')
{
printf("请输入一个n值,代表你要构建的线性表的长度\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值\n");
continue;
}
printf("请为L%d输入n个数据\n",i);
listshuru(L1);
system("cls");
printf("L%d排序后的结果\n",i);
paixu(L1);
listinprit(L1);
//system("cls");
printf("是否执行插入操作,是 请输入YES,不是请输入NO\n");
caozuopanduan();
system("cls");
if(a[0]=='Y')
{
printf("请在插入操作前输入您想要插入的位置以及要插入的数\n");
int vis=0;
flag=false;
while(!vis)
{
scanf("%d%d",&m,&x);
system("cls");
if(listinsert(L1,m,x)==-1)
printf("您的插入位置不合法,请在数据范围内输入,(注:1<=m<=n)\n");
else
vis=1;
if(vis==1)
{
if(panduanrong(L1)==-1)
{
printf("若需要扩容输入YES,若不需要扩容输入NO重新进行所有操作,请输入:\n");
caozuopanduan();
system("cls");
if(a[0]=='Y')
{
if(kuorong(L1)==-1)
{
printf("对不起,扩容失败,请重新进行所有操作\n");
flag=true;
break;
}
else
printf("恭喜您,扩容成功\n");
}
else
{
flag=true;
break;
}
}
}
}
if(flag) continue;
system("cls");
printf("输出插入后的序列\n");
listinprit(L1);
}
printf("是否执行删除操作,是 请输入YES,不是请输入NO\n");
caozuopanduan();
system("cls");
if(a[0]=='Y')
{
printf("再进行删除操作前,请您先输入要删除的位置\n");
int b,visb=0;
while(!visb)
{
scanf("%d",&b);
system("cls");
if(listdele(L1,b,k)==-1)
printf("您的插入位置不合法,请在数据范围内输入,(注:1<=b<=n)\n");
else
visb=1;
if(visb==1)
{
printf("输出删除元素后的序列\n");
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("清空数列线性表\n");
listclear(L1);
wrong=0;
while(!wrong)
{
if(judgeclear(L1))
{
printf("清空成功\n");
wrong=1;
}
else
printf("清空失败,我们会为您继续清空\n");
}
}
printf("是否执行合并操作,是 请输入YES,不是请输入NO\n");
caozuopanduan();
system("cls");
if(a[0]=='Y')
{
MergeList();
printf("输出合并后的序列\n");
for(int j=0;j<lengtha+lengthb;j++)
printf("%d ",L3[j]);
printf("\n");
}
printf("已经执行到第%d次,是否继续执行,是 请输入YES,不是请输入NO\n",++t);
caozuopanduan();
if(a[0]=='N')
{
if(t>=1)
printf("请输入一个n值,代表你要构建的线性表的长度\n");
break;
}
system("cls");
}
}
return 0;
}