天天看點

将兩個升序的順序表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
*/
           

繼續閱讀