有序线性表的合并

例:

已知线性表LA和LB中数据的元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的数据元素仍按值非递减有序排列。例如,设

LA = (3, 5, 8, 11) ; LB = (2, 6, 8, 9, 11, 15, 20)

则 LC = ( 2, 3, 5, 6, 8, 8, 9, 11, 11, 15, 20)。

分析:从上述问题要求可知,LC中的数据元素或是LA中的数据元素,或是LB中的数据元素,则只要先设LC为空表,然后将LA或LB中的元素逐个插入到LC中即可。

    为使LC中元素按值非递减有序排列,可设两个指针i或j分别指向LA和LB中某个元素,若设i当前所指的元素为a,j当前所指的元素为b,则当前应插入到LC中

    的元素c为 : c = (a <= b)?(a):(b)  显然,指针i和j的初值均为1,在所指元素插入LC之后,在LA或LB中顺序后移。上述归并算法描述如下:

void MergeList(List La, List Lb, LIst &Lc){
	// 已知线性表La和Lb中的数据元素按值非递减排列。
	//归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列。
	InitiList(Lc);
	i = j = 1; k = 0;
	La_len = ListLength(La) ; Lb_Len = ListLength(Lb);
	while((i <= La_len) && (j <= Lb_Len)){		//La和Lb均非空
		GetElem(La, i, ai); GetElem(Lb, i, bi);
		if(ai <= bj) {ListInsert(Lc, ++k, ai); ++i}
		else {ListInsert(Lc, ++k, bj); ++j}
	}
	while(i <= La_Len){
		GetElem(La, i, ai); ListInsert(Lc, ++k, ai);
	}
	while(i <= Lb_Len){
		GetElem(Lb, i, bj); ListInsert(Lc, ++k, bj);
	}
} //MergeList
以题目中的LA和LB为例,实现代码如下:

#include 
   
   
    
    
#include 
    
    
     
     

#define getlength(X) sizeof((X))/sizeof(int)
int La_len, Lb_len;

void Mergelist(int a[], int b[], int c[])
{
	int i, j, k;
	i = j =  k = 0;

	while((i < La_len) && (j < Lb_len)){
		if(a[i] <= b[j])	
				c[k++] = a[i++];
		else
				c[k++] = b[j++];
	}
	while(i < La_len)
			c[k++] = a[i++];
	while(j < Lb_len)
			c[k++] = b[j++];
}

int
main(void)
{
	int LA[] = {3, 5, 8, 11}, LB[] = {2, 6, 8, 9, 11, 15, 20};
	La_len = getlength(LA);
	Lb_len = getlength(LB);
	int LC[La_len + Lb_len];

	Mergelist(LA, LB, LC);

	int i = 0;
	
	while(1){
		printf("%d ", LC[i++]);
		if(i == La_len + Lb_len)
				break;
	}
	putc('\n', stdout);
	exit(0);
}

    
    
   
   



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值