数据结构——顺序表的合并

数据结构——顺序表的合并

具体要求:写一个函数,其函数的功能是将非递增顺序表LA和LB合并到非递增顺序表LC中


数据结构—顺序表的操作之合并顺序表

一、顺序表的结构

首先要定义的是顺序表的结构体,只有先定义了顺序表的结构体类型,才可以继续进行下一步操作

#define  maxsize  100 
typedef  struct {
	int  elem[maxsize];//线性表元素
	int  last;//线性表长度
}SeqList;

二、顺序表的操作

1.生成顺序表

在有了顺序表的结构之后,可以手动赋值顺序表,也可以动态读入顺序表,在这里我使用循环来生成我需要的顺序表的数据

代码如下(示例):

SeqList LA, LB, LC;
	int i;

	for (i = 0; i < 10; i++)
	{
		LA.elem[i] = 20 - 2 * i;
		printf("%d	", LA.elem[i]);
	}
	LA.last = 9;
	printf("\n");

	for (i = 0; i < 8; i++)
	{
		LB.elem[i] = 24 - 3 * i;
		printf("%d	", LB.elem[i]);
	}
	LB.last = 7;
	printf("\n");

	merge(&LA, &LB, &LC);

	for (i = 0; i <= LC.last; i++)
	{
		printf("%d ", LC.elem[i]);
	}
	printf("\n");

2.写合成函数merge

在merge函数中,主要是对于元素顺序和个数的判断,在这里用了两个变量i和j来记录LA和LB中转移的元素个数,用一个变量k来记录转移到LC中的元素个数,所以最后的LC的最后一个元素在数组中的下标即为k-1,数组长度即为k,也可以用LA和LB的数组下标来判断,在代码注释中都有解释
merge函数代码如下(示例):

//该函数的功能是将非递增顺序表LA和LB合并到非递增顺序表LC中
void merge(SeqList *LA, SeqList *LB, SeqList *LC)
{
	int i = 0, j = 0, k = 0;	//做初始化
	while (i <= LA->last&&j <= LB->last)	//用i和j来记录转移的循序表的个数
	{
		if (LA->elem[i] >= LB->elem[j])
		{
			LC->elem[k++] = LA->elem[i++];	//	i表示在LA中转移的个数
		}
		else
		{
			LC->elem[k++] = LB->elem[j++];	//	j表示在LB中转移的个数
		}
	}
	while (i <= LA->last)	//如果在LA中还有剩余的,则将其放到LC中
		LC->elem[k++] = LA->elem[i++];
	while (j <= LB->last)	//如果在LB中还有剩余的,则将其放到LC中
		LC->elem[k++] = LB->elem[j++];
	LC->last = LA->last + LB->last + 1;		//确定LC的数组下标
	printf("\n");
	if (k - 1 == LC->last)
	{
		printf("k-1=%d\n", k - 1);
		printf("LC的长度为 %d\n", LC->last);
	}
	


}

下面是该程序的完整代码

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#define  maxsize  100 
typedef  struct {
	int  elem[maxsize];//线性表元素
	int  last;//线性表最后一个元素的下标位置
}SeqList;

//该函数的功能是将非递增顺序表LA和LB合并到非递增顺序表LC中
void merge(SeqList *LA, SeqList *LB, SeqList *LC)
{
	int i = 0, j = 0, k = 0;	//做初始化
	while (i <= LA->last&&j <= LB->last)	//用i和j来记录转移的循序表的个数
	{
		if (LA->elem[i] >= LB->elem[j])
		{
			LC->elem[k++] = LA->elem[i++];	//	i表示在LA中转移的个数
		}
		else
		{
			LC->elem[k++] = LB->elem[j++];	//	j表示在LB中转移的个数
		}
	}
	while (i <= LA->last)	//如果在LA中还有剩余的,则将其放到LC中
		LC->elem[k++] = LA->elem[i++];
	while (j <= LB->last)	//如果在LB中还有剩余的,则将其放到LC中
		LC->elem[k++] = LB->elem[j++];
	LC->last = LA->last + LB->last + 1;		//确定LC的数组下标
	printf("\n");
	if (k - 1 == LC->last)
	{
		printf("k-1=%d\n", k - 1);
		printf("LC的长度为 %d\n", LC->last);
	}
	


}

void main(void)
{
	SeqList LA, LB, LC;
	int i;

	for (i = 0; i < 10; i++)
	{
		LA.elem[i] = 20 - 2 * i;
		printf("%d	", LA.elem[i]);
	}
	LA.last = 9;
	printf("\n");

	for (i = 0; i < 8; i++)
	{
		LB.elem[i] = 24 - 3 * i;
		printf("%d	", LB.elem[i]);
	}
	LB.last = 7;
	printf("\n");

	merge(&LA, &LB, &LC);

	for (i = 0; i <= LC.last; i++)
	{
		printf("%d ", LC.elem[i]);
	}
	printf("\n");
	
}




总结

主要是完成了对于线性表的合并,操作,要注意在合并函数中对表的元素的标记,不要遗漏元素,还有就是合并后表的长度和最后一个元素的下标的关系,这是日后学习其他数据结构的基础。

  • 27
    点赞
  • 147
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值