标签:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAX 1000
#define MAXM 10
using namespace std;
typedef int Status;
bool flag;
int Lx[MAX],Ly[MAX],L3[MAX<<1];
int lengtha,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;//表尾元素
//printf("%d# %d#\n",p,q);
for(++p;p<=q;++p)
L.elem[p-1]=L.elem[p];
//*(p-1)=*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++];
}
int main()
{
int k,a,i;
printf("请输入一个n值,代表你要构建的线性表的长度\n");
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=2;i++)
{
sqlist L1;
if(initlist(L1)==-1)
{
printf("线性表构建失败,请重新输入n值\n");
continue;
}
printf("请为L%d输入n个数据\n",i);
listshuru(L1);
printf("L%d排序后的结果\n",i);
paixu(L1);
listinprit(L1);
printf("是否执行插入操作,是 请输入1,不是请输入2\n");
scanf("%d",&a);
if(a==1)
{
printf("请在插入操作前输入您想要插入的位置以及要插入的数\n");
int vis=0;
flag=false;
while(!vis)
{
scanf("%d%d",&m,&x);
if(listinsert(L1,m,x)==-1)
printf("您的插入位置不合法,请在数据范围内输入,(注:1<=m<=n)\n");
else
vis=1;
if(vis==1)
{
if(panduanrong(L1)==-1)
{
printf("若需要扩容输入1,若不需要扩容输入2重新进行所有操作,请输入:\n");
scanf("%d",&a);
if(a==1)
{
if(kuorong(L1)==-1)
{
printf("对不起,扩容失败,请重新进行所有操作\n");
flag=true;
break;
}
else
printf("恭喜您,扩容成功\n");
}
else
{
flag=true;
break;
}
}
}
}
if(flag) continue;
printf("输出插入后的序列\n");
listinprit(L1);
}
printf("是否执行删除操作,是 请输入1,不是请输入2\n");
scanf("%d",&a);
if(a==1)
{
printf("再进行删除操作前,请您先输入要删除的位置\n");
int b,visb=0;
while(!visb)
{
scanf("%d",&b);
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;
}
listclear(L1);
}
printf("是否执行合并操作,是 请输入1,不是请输入2\n");
scanf("%d",&a);
if(a==1)
{
MergeList();
for(int j=0;j<lengtha+lengthb;j++)
printf("%d ",L3[j]);
printf("\n");
}
printf("已经执行到第%d次,是否继续执行,是 请输入1,不是请输入2\n");
scanf("%d",&a);
if(a==2)
break;
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/tonghao/p/4833723.html