以上为题目。
归并和链表的归并相通,可相互印证理解、
下面为代码:
#include <stdio.h>
#include <stdlib.h>
#define List_init_size 10000
typedef int Element;
typedef struct
{
Element *elem;
int length;
int listsize;
}Sqlist;
int Initlist(Sqlist *L)//一如既往的初始化初始化顺序表
{
L->elem=(Element *)malloc(List_init_size*sizeof(Element));
if(!L->elem)return -1;
L->length=0;
L->listsize=List_init_size;
}
int Initlist1(Sqlist *L)//一如既往的初始化顺序表
{//注意新表长度为原来两表长度的两倍,需重新分配储存容量
L->elem=(Element *)malloc(2*List_init_size*sizeof(Element));
if(!L->elem)return -1;
L->length=0;
L->listsize=List_init_size;
}
void Createlist(Sqlist *L,int m)//输入函数
{
int i;
for(i=0;i<m;i++)
{
scanf("%d",&L->elem[i]);
}
L->length=m;
}
int Listinsert(Sqlist *L,int k,int e)
{//将元素e插入到第k个元素之前
if(k<1||k>L->length+1)return -1;//判断插入位置的合法性
int j;
int pos=k;
for(j=L->length-1;j>=pos-1;j--)
{//从最后一个位置开始移位,将需要插入的位置空出
L->elem[j+1]=L->elem[j];
}
L->elem[pos-1]=e;
L->length++;//每插入一个元素,顺序表长度加一,勿忘
return 1;
}
void Mergelist(Sqlist *A,Sqlist *B,Sqlist *C)
{//需要合并的两表A和B,新表C
Initlist1(C);//初始化C
int i=1,j=1;
int k=0;//k从0开始,为了下面方便
int len_a=A->length,len_b=B->length;
while((i<=len_a)&&(j<=len_b))
{//只要有一个表已经遍历完毕,即可跳出循环
if(A->elem[i-1]>B->elem[j-1])
{
Listinsert(C,++k,B->elem[j-1]);
j++;
}
else {
Listinsert(C,++k,A->elem[i-1]);
i++;
}
}
while(i<=len_a)//若A没有遍历完,则将A插入到新表后面
{
Listinsert(C,++k,A->elem[i-1]);
i++;
}
while(j<=len_b)//与上面同理
{
Listinsert(C,++k,B->elem[j-1]);
j++;
}
}
void Display(Sqlist *L)//输出函数
{
int i;
for(i=0;i<L->length;i++)
{
printf(i==(L->length-1)?"%d\n":"%d ",L->elem[i]);
}
}
int main()
{
int m,n;
Sqlist A,B,C;
scanf("%d%d",&m,&n);
Initlist(&A);
Initlist(&B);
Createlist(&A,m);
Createlist(&B,n);
Mergelist(&A,&B,&C);
Display(&C);
return 0;
}
此代码在codeblocks环境中运行。