顺序表应用5:有序顺序表归并
Time Limit: 100MS Memory limit: 800K
题目描述
已知顺序表A与B是两个有序的顺序表,其中存放的数据元素皆为普通整型,将A与B表归并为C表,要求C表包含了A、B表里所有元素,并且C表仍然保持有序。
输入
输入分为三行:
第一行输入m、n(1<=m,n<=10000)的值,即为表A、B的元素个数;
第二行输入m个有序的整数,即为表A的每一个元素;
第三行输入n个有序的整数,即为表B的每一个元素;
第一行输入m、n(1<=m,n<=10000)的值,即为表A、B的元素个数;
第二行输入m个有序的整数,即为表A的每一个元素;
第三行输入n个有序的整数,即为表B的每一个元素;
输出
输出为一行,即将表A、B合并为表C后,依次输出表C所存放的元素。
示例输入
5 3 1 3 5 6 9 2 4 10
示例输出
1 2 3 4 5 6 9 10
提示
来源
示例程序
-
用的指针
#include <stdio.h> #include <stdlib.h> #include <malloc.h> #define LISTINCREASMENT 20000 #define LISTSIZE 20000 #define OVERFLOW -1 #define OK 1 typedef int ElemType; typedef struct { int * elem; int length; int listsize; } Sqlist; int SqInitial(Sqlist * L) { L->elem=(int *) malloc (LISTSIZE*sizeof(int)); if (! L->elem) exit(OVERFLOW); L->length=0; L->listsize=LISTSIZE; return OK; } void f(Sqlist * l1,Sqlist * l2,Sqlist * l3,int n,int m) { int *p,*q; p=l1->elem; q=l2->elem; int k=1; while(p<l1->elem+n&&q<l2->elem+m) { if(*p>*q) { l3->elem[k++]=*q; q++; } else { l3->elem[k++]=*p; p++; } } if(p==l1->elem+n) { while(q<l2->elem+m) { l3->elem[k++]=*q; q++; } } else if(q==l2->elem+m) { while(p<l1->elem+n-1) { l3->elem[k++]=*p; p++; } } } int main() { Sqlist l1,l2,l3; int m,n,i; scanf("%d%d",&n,&m); SqInitial(&l1); SqInitial(&l2); SqInitial(&l3); for(i=0;i<n;i++) scanf("%d",&l1.elem[i]); for(i=0;i<m;i++) scanf("%d",&l2.elem[i]); f(&l1,&l2,&l3,n,m); for(i=1;i<=n+m-1;i++) printf("%d ",l3.elem[i]); printf("%d",l3.elem[i]); return 0; }