【问题描述】
设有两个用顺序表表示的有序集合,输出它们的并集,要求仍然保持有序。
【输入形式】
第一行输入两个整数N和M(不大于100),分别表示两个集合的长度;
第二行输入第一个集合的N个元素(递增有序);
第三行输入第二个集合的M个元素(递增有序);
【输出形式】
输出两个集合的并集(仍然保持有序),元素之间以空格分隔。
【样例输入】
5 4
-3 2 4 7 20
2 3 4 5
【样例输出】
-3 2 3 4 7 20
#include <stdio.h>
#include <malloc.h>
#define INIT_SIZE 100
#define INCREM 10
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef struct SqList{
ElemType *slist;
int length;
int listsize;
}SqList;
int initList_sq(SqList *L){
L->slist=(ElemType*)malloc(INIT_SIZE*sizeof(ElemType));
if(!L->slist)return ERROR;
L->length=0;
L->listsize=INIT_SIZE;
return OK;
}
int createList_sq(SqList *L,int n){
int i;
for(i=0;i<n;i++)
scanf("%d",&L->slist[i]);
L->length=n;
return OK;
}
int insertList_sq(SqList *L,SqList *L2,SqList *L3){
int i=0,j=0,k=0;
while (i<L->length&&j<L2->length){
if(L->slist[i]<=L2->slist[j]) {
L3->slist[k++]=L->slist[i++];
}else {
L3->slist[k++]=L2->slist[j++];
}
}
while(i<L->length) {
L3->slist[k++]=L->slist[i++];
}
while(j<L2->length) {
L3->slist[k++]=L2->slist[j++];
}
L3->length=k;
return OK;
}
int deleteList_sq(SqList *L){
int i=0,j;
while(i<L->length)
{
while((L->slist[i]==L->slist[i+1])&&(i<L->length))
{
for(j=i;j<L->length;j++)
L->slist[j]=L->slist[j+1];
L->length--;
}
i++;
}
return OK;
}
void printList_sq(SqList *L){
int i;
for(i=0;i<L->length;i++)
printf("%d ",L->slist[i]);
}
int main(){
int n,n2;
SqList L;SqList L2;SqList L3;
initList_sq(&L);initList_sq(&L2);initList_sq(&L3);
scanf("%d%d",&n,&n2);
createList_sq(&L,n);createList_sq(&L2,n2);
insertList_sq(&L,&L2,&L3);
deleteList_sq(&L3);
printList_sq(&L3);
}