实验目的和要求:
Status initlist(sqlist &L)
Status listinsert( sqlist &L, int i, int e )
Status listindele( sqlist &L, int i, int &e )
Status listinprint( sqlist L)
void MergeList(sqlist La, sqlist Lb, sqlist &Lc)
void inverse(sqlist &Lc)
完成以上几个函数,实现手工创建两个非递减序列存放于La和 Lb中,并调用MergeList实现数据的合并。合并之后用inverse把Lc中的数据就地逆置(不占用太多额外辅助空间,空间复杂度为常数级别)
关于程序健壮性的内容:
1、对于插入与删除位置若不合法请给出适当提醒
2、若输入的数据不是非递减排列可通过自己写的
sort()函数排序后再进行后续操作
实验代码如下:
#include <stdio.h>
#define ERROR 0
#define OK 1
#define MAXSIZE 15
#define OVERFLOW 0
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType *elem;
int length;
}Sqlist;
Status InitList(Sqlist &L)
{
L.elem=new ElemType[MAXSIZE];
if(!L.elem) return(OVERFLOW);
else {L.length=0;
return OK;
}}
Status ListInsert(Sqlist &L,int i,ElemType e)
{
if((i<1)||(i>L.length+1)) return printf("Sorry!Locate is error!");
else if(L.length==MAXSIZE) return printf("Sorry!Locate is error!");
else {
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 OK;
}
}
Status Listindele(Sqlist &L,int i){
if((i<1)||(i>L.length)) return printf("Sorry!Locate is error");
else
{
//e=L.elem [i-1];,int &e
for(int j=i;j<=L.length-1;j++)
L.elem [j-1]=L.elem [j];
--L.length ;
return OK;
}}
void Listprint(Sqlist L)
{
int i;
printf("\n顺序表中的数据为:\n");
for(i=0;i<L.length;i++)
{
printf("%5d ",L.elem[i]);
//if(i%5==0) printf("\n");
}
}
void MergeList(Sqlist LA,Sqlist LB,Sqlist &LC)
{
int *pa,*pb,*pc;
int *pa_last,*pb_last;
LC.length=LA.length+LB.length;
LC.elem=new ElemType[LC.length];
pa=LA.elem ;
pb=LB.elem ;
pc=LC.elem ;
pa_last=LA.elem+LA.length-1;
pb_last=LB.elem+LB.length-1;
while((pa<=pa_last)&&(pb<=pb_last))
{
if(*pa<=*pb)
*pc++=*pa++;
else *pc++=*pb++;
}
while(pa<=pa_last)
{
*pc++=*pa++;
}
while(pb<=pb_last)
{
*pc++=*pb++;
}
}
void Inverse(Sqlist &LC)
{
ElemType t,i,j;
for(i=0,j=LC.length-1;i<j;i++,j--)
{
t=LC.elem[i];
LC.elem [i]=LC.elem [j];
LC.elem [j]=t;
}
}
void sort(Sqlist &L){
ElemType c;
for(int j=1;j<=L.length-1;j++)
for(int i=0;i<=L.length-j-1;i++)
if(L.elem[i]>L.elem[i+1]){
c=L.elem[i];
L.elem[i]=L.elem[i+1];
L.elem[i+1]=c;
}
}
main(){
int i,j,e;
Sqlist L,L1,L2;
InitList( L);
printf("\n 请输入你想创建的顺序表的长度(15以内): \n");
scanf("%d",&L.length);
printf("\n 请依次输入%d个整数,以空格分隔:\n",L.length);
for(i=0;i<L.length;i++)
scanf("%d",&L.elem[i]);
Listprint(L);
printf("\n请输入要插入元素的位置(1~%d) :\n",L.length+1);
scanf("%d",&j);
printf("\n请输入要插入元素的值:\n");
scanf("%d",&e);
ListInsert(L,j,e);
Listprint(L);
printf("\n请输入要删除元素的位置(1~%d):\n",L.length);
scanf("%d",&i);
Listindele(L,i);
Listprint(L);
printf("\n将表排序后:\n");
sort(L);
Listprint(L);
InitList( L1);
printf("\n 请输入你想创建的顺序表的长度(15以内): \n");
scanf("%d",&L1.length);
printf("\n 请依次输入%d个整数,以空格分隔:\n",L1.length);
for(i=0;i<L1.length;i++)
scanf("%d",&L1.elem[i]);
Listprint(L1);
printf("\n将表排序后:\n");
sort(L1);
Listprint(L1);
MergeList(L,L1,L2);
Listprint(L2);
Inverse(L2);
Listprint(L2);
}
实验结果:
实验运行的软件为Dev-C++
实验分析:
实现手工创建两个非递减序列存放于La和 Lb中,并调用MergeList实现数据的合并。合并之后用inverse把Lc中的数据就地逆置(不占用太多额外辅助空间,空间复杂度为常数级别).
对于插入与删除位置若不合法请给出适当提醒
输入的数据不是非递减排列可通过自己写的sort()函数排序后再进行后续操作