顺序表_归并顺序表举例

顺序表的归并举例

说明

  • 已知:顺序线性表La和Lb的元素按值非递减排序
  • 要求:归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排序(不改变表La和表Lb)

以下内容保存在algo2-1.cpp

/*
 * 时间:2021.01.30
 * 内容:实现算法2.7
 * 算法2.7:
 * 已知顺序线性表La和Lb的元素按值非递减排序
 * 归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排序(不改变表La和表Lb)
 */

#include "c1.h"

typedef int ElemType;	// 定义ElemType为整型
#include "c2-1.h"	// 线性表的顺序存储结构
#include "bo2-1.h"	// 线性表顺序存储结构的基本操作
#include "fun2-2.h"	//  包括qual(),comp(),print(),print1()和print2()函数

void MergeList(SqList La, SqList Lb, SqList &Lc)	// 算法2.7
{// 已知顺序线性表La和Lb的元素按值非递减排序
 // 归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排序(不改变表La和表Lb)

	ElemType * pa, *pa_last, *pb, *pb_last, *pc;
	
	pa = La.elem;	// pa指向表La的第一个元素
	pb = Lb.elem;	// pb指向表Lb的第一个元素

	Lc.listsize  = Lc.length = Lc.length + Lb.length;	// 不用InitList()创建空表Lc
	pc = Lc.elem = (ElemType *)malloc(Lc.listsize * sizeof(ElemType));	// 分配所需空间
	if(!Lc.elem)	// 储存分配失败
	{
		exit(OVERFLOW);
	}

	pa_last = La.elem + La.length - 1;	// pa_last指向表La的最后一个元素
	pb_last = Lb.elem + Lb.length - 1;	// pb_last指向表Lb的最后一个元素

	while(pa <= pa_last && pb <= pb_last)	//表La和表Lb均有元素没有归并
	{
		if(* pa <= * pb)	// 表La的当前元素不大于表Lb的当前元素
		{
			* pc++ = * pa++;	// 将pa所指单元的值赋给pc所指单元后,pa和pc分别+1(指向下一个单元)
		}
		else
		{
			* pc++ = * pb++;	// 将pb所指单元的值赋给pc所指单元后,pb和pc分别+1(指向下一个单元)
		}	// 以下两个while循环只会有一个被执行
	}

	while(pa <= pa_last)	// 表Lb中的元素全部归并
	{
		* pc++ = * pa++;	// 插入La中的剩余元素
	}

	while(pb <= pb_last)	// 表La中的元素全部归并
	{
		* pc++ = * pb++;	// 插入Lb的剩余元素
	}

	return;
}

void main()
{
	SqList La, Lb, Lc;
	int j;

	InitList(La);	// 创建空表La
	for(j = 1; j <= 5; j++)	// 在表La中插入5个元素,依次为1,2,3,4,5
	{
		ListInsert(La, j, j);
	}
	printf("La = ");	// 输出表La的内容
	ListTraverse(La, print1);
	
	InitList(Lb);	// 创建空表Lb
	for (j = 1; j <= 5; j++)
	{
		ListInsert(Lb, j, 2 * j);	// 在表Lb中插入5个元素,依次为2,4,6,8,10
	}
	printf("Lb = ");	// 输出表Lb的内容
	ListTraverse(Lb, print1);

	MergeList(La, Lb, Lc);	// 由按非递减排序的表La,Lb得到按非递减排序的表Lc
	printf("Lc = ");	// 输出表Lc的内容
	ListTraverse(Lc, print1);	// 输出表Lc的内容

	return;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值