#include <stdio.h>
#include <malloc.h>
#include <process.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define INITSIZE 100
#define INCREMENT 10 //预定义常量
typedef int Status; //定义状态结果类型
typedef int ElemType; //定义数据元素类型
typedef struct {
ElemType *elem;
int length;
int listsize;
}SqList; //定义顺序表的存储结构
Status InitList(SqList &L)
{//构造一个空的顺序表L.
L.elem=(ElemType*)malloc(INITSIZE*sizeof(ElemType));
if(!L.elem)exit(OVERFLOW);
L.length=0;
L.listsize=INITSIZE;
return(OK);
}
void Assign(SqList &L)
{ //为顺序表L的各元素赋值.
int i, N;
printf("Please input the Number of the SqList:");
scanf("%d",&N);
printf("Please input the elements:");
for(i=0;i<N;i++)
{ scanf("%d",&L.elem[i]);
L.length++;}
}
void ListTraverse(SqList L)
{//遍历顺序表L.
int i;
for(i=0;i<=L.length-1;i++)
printf("%d ",L.elem[i]);
printf("\n");
printf("the length is:%d\n",L.length);
}
void Print(ElemType g)
{
printf("%d\n",g);
}
void ListTraverse2(SqList L,void (*vi)(ElemType))
{//遍历顺序表L的另一种方法.
int i;
ElemType *p;
p=L.elem;
for (i=0;i<=L.length-1;i++)
vi(*p++);
printf("the length is:%d\n",L.length);
}
Status GetELem(SqList L, int i, ElemType &e)
{//取顺序表L的第i个元素的值,用e返回.
e=L.elem[i-1];
return OK;
}
int ListLength(SqList L)
{ //求顺序表的长度
return(L.length);
}
Status ListInsert(SqList &L, int i, ElemType e)
{ //在顺序表L的第i个元素前插入元素e.
ElemType *p,*q,*newbase;
if(i<1||i>L.length+1)return ERROR;
if(L.length==L.listsize)
{
newbase=(ElemType*)realloc(L.elem,(INITSIZE+INCREMENT)*sizeof(ElemType));
if(!newbase)exit(OVERFLOW);
L.elem=newbase;
L.listsize+=INCREMENT;
}
q=&L.elem[i-1];
for(p=&L.elem[L.length-1];p>=q;--p)
*(p+1)=*p;
*q=e;
++L.length;
return OK;
}
void MergeList(SqList La,SqList Lb, SqList &Lc)
{ //已知顺序表La和Lb的元素按值非递减排列,
//归并La和Lb得到新的顺序表Lc,Lc的元素也按值非递减排列.
ElemType *pa,*pb,*pc,*pa_last,*pb_last;
pa=La.elem;
pb=Lb.elem;
Lc.listsize=Lc.length=La.length+Lb.length;
pc=Lc.elem=(ElemType*)malloc(Lc.listsize*sizeof(ElemType));
if(!Lc.elem)exit(OVERFLOW);
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++;
}
int main()
{ SqList L,L1,L2;
int i,j;
ElemType e,f;
if(InitList(L)) printf("Init success\n"); //初始化顺序表L
Assign(L); //为L的元素赋值
ListTraverse(L); //遍历顺序表L
//ListTraverse2(L,Print);
printf("Plsese input the location i:");
scanf("%d",&i);
GetELem(L,i,e); //取顺序表的第i 个元素,赋给e
printf("The ith elem is: %d\n",e);
printf("Please input the Inserted elem's No. and the value:");
scanf("%d %d",&j,&f);
ListInsert(L,j,f); //在L的第i个位置之前插入f
ListTraverse(L);
InitList(L1); //初始化顺序表L1
Assign(L1); //为L1的元素赋值
ListTraverse(L1); //遍历顺序表L1
MergeList(L,L1,L2); //归并顺序表L,L1,得到L2
ListTraverse(L2); //遍历顺序表L2
return 0;
}