Chap2-3,顺序表的应用_合并有序顺序表;《数据结构》-C语言版本源码实现,严蔚敏版

本文介绍了一种简单的有序顺序表合并方法,通过自定义函数实现两个已排序顺序表的合并,确保合并后的顺序表仍保持有序状态。文章提供了C语言实现的代码示例,包括合并后存放在新表和原有表中的两种情况。

0·说明

本文实现的方法比较简单,只是起到了对之前书序表相关函数的使用的作用,没有使用到复杂的指针。本文仅作为参考,如果您比较感兴趣,可自行撰写函数。此外需要说明的是,如果是无序的两个顺序表合并,可先写一个排序函数,加在主函数初始化时,这样本节的算法就能够继续使用。

1.main.c

//***********************************************
//求有序顺序表LA和LB的合并,合并后有序
//***********************************************

#include "sequenceList.h"

void printf_Elem(ElemType e)
{
	printf("%d	",e);
}

Status compare(ElemType a,ElemType b)
{
	return a<=b? YES:NO;
}


//合并后存放在Lc顺序表中
void MergeSqList1(SqList La,SqList Lb,SqList Lc)
{
	int La_len,Lb_len;
	int i,j;
	ElemType e;

	La_len = ListLength_Sq(La);
	Lb_len = ListLength_Sq(Lb);
//	Lc.length = La_len + Lb_len;

	for(i=1;i<=La_len;i++)
		ListInsert_Sq(&Lc,i,La.elem[i-1]);

	for(i=1;i<=Lb_len;i++)
	{
		GetElem_Sq(Lb,i,&e);	
		j=LocateElem_Sq(Lc,e,compare);

		if(j)
			ListInsert_Sq(&Lc,j,e);
		else
			ListInsert_Sq(&Lc,Lc.length+1,e);
	}

}


//合并后存放在La顺序表中
void MergeSqList2(SqList La,SqList Lb)   
{
	int La_len,Lb_len;
	int i,j;
	ElemType e;

	La_len = ListLength_Sq(La);
	Lb_len = ListLength_Sq(Lb);

	for(i=1;i<=Lb_len;i++)
	{
		GetElem_Sq(Lb,i,&e);	
		j=LocateElem_Sq(La,e,compare);

		if(j)
			ListInsert_Sq(&La,j,e);
		else
			ListInsert_Sq(&La,La.length+1,e);
	}
}

int main(void)
{
	SqList La,Lb,Lc;
	ElemType a[4]={3,5,8,11};	
	ElemType b[7]={2,6,8,9,11,15,20};

	int i;

	InitList_Sq(&Lc);
	
	InitList_Sq(&La);                 //对La顺序表进行初始化赋值
	for(i=1;i<=4;i++)
		ListInsert_Sq(&La,i,a[i-1]);
	printf("La元素:");
	ListTraverse_Sq(La,printf_Elem);
	printf("\r\n");

	InitList_Sq(&Lb);			 	  //对Lb顺序表进行初始化赋值
	for(i=1;i<=7;i++)
		ListInsert_Sq(&Lb,i,b[i-1]);
	printf("Lb元素:");
	ListTraverse_Sq(Lb,printf_Elem);
	printf("\r\n");

	printf("--------------------------------------\r\n");
	printf("合并后元素L1:	");
	MergeSqList1(La,Lb,Lc);
	Lc.length = La.length +Lb.length;
	ListTraverse_Sq(Lc,printf_Elem);
	printf("\r\n");
	printf("合并后元素L2:	");
	MergeSqList2(La,Lb);
	La.length = La.length +Lb.length;
	ListTraverse_Sq(La,printf_Elem);
	printf("\r\n\r\n");
}

2.实验结果:

3.讨论:

程序中在调用合并函数之后,我对新生成的顺序表长度进行了再一次的定义,如果不添加此句,程序会出现错误。但是按照调用函数的作用,应该不用写这样的语句。这一点我比较不明白,还请指教。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值