天天看点

将两个升序的顺序表A和B合并为一个升序表C将两个升序的顺序表A和B合并为一个升序表C

将两个升序的顺序表A和B合并为一个升序表C

有顺序表A和B,其表中的元素均按照由小到大排序,将A和B两个升序的顺序表A和B合并为一个升序表C ,C中的元素也按照由大到小排序

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 1024
typedef struct
{
	int data[MAXSIZE];//存储顺序表中的元素 
	int len;//顺序表长度
}SeqList;//顺序表类型 
SeqList *Init_SeqList()//顺序表初始化 
{
	SeqList *L;
	L=(SeqList*)malloc(sizeof(SeqList));
	L->len=0;
	return L; 	
}
void CreatList(SeqList **L)//建立顺序表
{
	int i,n;
	printf("Input length of List:");
	scanf("%d",&n);
	printf("Input elements of List:\n");
	for(i=1;i<=n;i++)
	   scanf("%d",&(*L)->data[i]);
	(*L)->len=n;
}
int Merge(SeqList *A,SeqList *B,SeqList **C)//将两个升序的顺序表A和B合并为一个升序表C 
{
	int i=1,j=1,k=1;
	if(A->len+B->len>=MAXSIZE) 
	   printf("Error !\n");
	else
	{
		*C=(SeqList *)malloc(sizeof(SeqList));
		while(i<=A->len&&j<=B->len)
		   if(A->data[i]<B->data[j])
		      (*C)->data[k++]=A->data[i++];
		    else
		      (*C)->data[k++]=A->data[i++];
		while(i<=A->len)//当表A未复制完
		   (*C)->data[k++]=A->data[i++];
		while(j<=B->len)//当表B未复制完
		   (*C)->data[k++]=B->data[j++];
		(*C)->len=k-1;//存储表长 
	 } 
 } 
void print(SeqList *L)//顺序表的输出
{
	int i;
	for(i=1;i<=L->len;i++)
	  printf("%2d",L->data[i]);
	printf("\n");
} 

int main()
{
	SeqList *A,*B,*C;
	A=Init_SeqList();//顺序表初始化 
	printf("Creat ListA:\n");
	CreatList(&A);//建立顺序表 
	print(A);//输出顺序表
	B=Init_SeqList();
	printf("Creat ListB:\n");
	CreatList(&B);
	print(B);
	C=Init_SeqList();
	Merge(A,B,&C);//将升序表A和B合并未升序表C 
	print(C);	 
}
/*
5
1 2 3 4 5
4
6 7 8 9
*/
           

继续阅读