【王道2023考研计算机数据结构复习指导课后代码题】——03.合并两个有序顺序表为新的有序顺序表

一【题目类别】

  • 顺序表

二【题目来源】

  • 本题目选自王道2023考研计算机数据结构复习指导18页中二、综合应用题之07题

三【题目描述】

  • 将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表。

四【解题思路】

  • 这道题目还是比较经典的,在各个高校的计算机考研真题中频频出现,或为原题,或为改编题,但是我们只要理解了这种类型题目的本质,这种题看起来就不是那么难了。我们利用题目给的信息:初始化两个顺序表都为有序顺序表,那么自然就想到利用这个性质,我们扫描两个顺序表,比较两个顺序表中元素的大小关系,我们只需要将小的那个存入新的顺序表中,然后继续向下重复操作即可。需要注意的是,有可能会有一种情况就是:某一个顺序表会有剩余,那么我们只需要把剩余这部分存入新的顺序表即可

五【时间频度】

  • 时间复杂度: O ( m a x ( m , n ) ) O(max(m,n)) O(max(m,n)),其中 m 、 n m、n mn为两个待合并顺序表长度
  • 空间复杂度: O ( 1 ) O(1) O(1)

六【代码实现】

/*王道2023考研计算机数据结构复习指导18页中二、综合应用题之07题*/

/*去除警告*/
#define _CRT_SECURE_NO_WARNINGS

/*引入头文件*/
#include<stdio.h>
#include<stdbool.h>

/*宏定义顺序表最大长度为50*/
#define MaxSize 50

/*声明定义ElemType为int类型*/
typedef int ElemType;

/*声明定义顺序表结构体,其中包括顺序表和顺序表的长度*/
typedef struct
{
	ElemType data[MaxSize];
	int length;
}SqList;

void Merge(SqList A, SqList B)
{
	if (A.length + B.length > MaxSize)/*如果合并后的长度大于顺序表最大长度,则程序结束执行*/
	{
		return 0;
	}
	SqList C;
	C.length = 0;
	int indexA = 0, indexB = 0, indexC = 0;/*分别为三个顺序表的索引*/
	while (indexA < A.length && indexB < B.length)/*循环,A和B依次比较,取值小的存入C中*/
	{
		if (A.data[indexA] <= B.data[indexB])
		{
			C.data[indexC++] = A.data[indexA++];
		}
		else
		{
			C.data[indexC++] = B.data[indexB++];
		}
	}
	while (indexA < A.length)/*将还没有比较完的顺序表存入C中*/
	{
		C.data[indexC++] = A.data[indexA++];
	}
	while (indexB < B.length)
	{
		C.data[indexC++] = B.data[indexB++];
	}
	C.length = indexC;
	/*打印合并后的顺序表*/
	printf("合并后的顺序表为:");
	for (int i = 0; i < C.length; i++)
	{
		printf("%d ", C.data[i]);
	}
	/*换行*/
	printf("\n");
}

/*主函数*/
int main()
{
	/*数据初始化*/
	SqList A,B;
	A.length = 0;
	B.length = 0;
	int lenA, lenB;
	printf("请输入顺序表A的长度(长度应≤25):");
	scanf("%d", &lenA);
	printf("请输入顺序表B的长度(长度应≤25):");
	scanf("%d", &lenB);
	printf("请输入顺序表A的元素:");
	for (int i = 0; i < lenA; i++)
	{
		scanf("%d", &A.data[i]);
		A.length++;
	}
	printf("请输入顺序表B的元素:");
	for (int i = 0; i < lenB; i++)
	{
		scanf("%d", &B.data[i]);
		B.length++;
	}
	/*打印初始顺序表*/
	printf("初始顺序表A为:");
	for (int i = 0; i < A.length; i++)
	{
		printf("%d ", A.data[i]);
	}
	/*换行*/
	printf("\n");
	printf("初始顺序表B为:");
	for (int i = 0; i < B.length; i++)
	{
		printf("%d ", B.data[i]);
	}
	/*换行*/
	printf("\n");
	/*合并*/
	Merge(A, B);
	/*暂停程序*/
	system("pause");
	/*函数结束*/
	return 0;
}

七【程序测试】

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IronmanJay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值