数据结构—有序表的合并

2023-05-16

1.有序表合并

  • 问题描述:已知线性表La 和Lb中的数据元素按值非递减有序排列,现要求将La和Lb归并为一个新的线性表Lc,且Lc中的数据元素仍按值非递减有序排列。
  • 例如:
    • La=(1 ,7, 8)
    • Lb=(2, 4, 6, 8, 10, 11)
    • Lc=(1, 2, 4, 6, 7 , 8, 8, 10, 11)

2.有序的顺序表合并

  • 算法步骤
    • 创建一个空表Lc
    • 依次从La或Lb中“摘取”元素值较小的结点插入到Lc表的最后,直至其中一个表变空为止
    • 继续将La或Lb其中一个表的剩余结点插入在Lc表的最后
  • 算法描述
void Combine(SqList A, SqList B, SqList &C) 
{
	int *pa, *pb, *pc, *pa_last, *pb_last;
	pa = A.elem;   // //指针pa和pb的初值分别指向两个表的第一个元素 
	pb = B.elem;
	C.length = A.length + B.length;   // 新表长度为待合并两表的长度之和 
	C.elem = new int[C.length];   // 为合并后的新表分配一个数组空间 
	pc = C.elem;    // 指针pc指向新表的第一个元素 
	pa_last = A.elem + A.length - 1;   // 指针pa_last指向LA表的最后一个元素 
	pb_last = B.elem + B.length - 1;  // 指针pb_last指向LB表的最后一个元素 
	while (pa <= pa_last && pb <= pb_last) // 两个表都非空 
	{
		if (*pa <= *pb) 
		{
			*pc++ = *pa++;
		}
		else 
		{
			*pc++ = *pb++;
		}
	}
	while (pa <= pa_last) 
	{
		*pc++ = *pa++;
	}
	while (pb <= pb_last) 
	{
		*pc++ = *pb++;
	}
}
  • 代码实现
  • main.cpp
#include<iostream>

using namespace std;

#define MAX 100

typedef struct 
{
	int *elem;//存储空间基地址 
	int length;
}SqList;

int InitList(SqList &L) 
{
	L.elem = new int[MAX];
	if (!L.elem)
	{
		return 0;
	}
	L.length = 0;
	return 1;
}

void TraveList(SqList L) 
{
	for (int i = 0; i < L.length; i++) 
	{
		printf("%d ", L.elem[i]);
	}
	printf("\n");
}

void CreateList(SqList &L, int n) 
{
	printf("请输入表的元素:\n");
	for (int i = 0; i < n; i++) 
	{
		printf("请输入第%d个元素值:", i + 1);
		int e;
		scanf("%d", &e);
		L.elem[i] = e;
		L.length += 1;
	}
}

void Combine(SqList A, SqList B, SqList &C) 
{
	int *pa, *pb, *pc, *pa_last, *pb_last;
	pa = A.elem;   // //指针pa和pb的初值分别指向两个表的第一个元素 
	pb = B.elem;
	C.length = A.length + B.length;   // 新表长度为待合并两表的长度之和 
	C.elem = new int[C.length];   // 为合并后的新表分配一个数组空间 
	pc = C.elem;    // 指针pc指向新表的第一个元素 
	pa_last = A.elem + A.length - 1;   // 指针pa_last指向LA表的最后一个元素 
	pb_last = B.elem + B.length - 1;  // 指针pb_last指向LB表的最后一个元素 
	while (pa <= pa_last && pb <= pb_last) // 两个表都非空 
	{
		if (*pa <= *pb) 
		{
			*pc++ = *pa++;
		}
		else 
		{
			*pc++ = *pb++;
		}
	}
	while (pa <= pa_last) 
	{
		*pc++ = *pa++;
	}
	while (pb <= pb_last) 
	{
		*pc++ = *pb++;
	}
}

int main() 
{
	SqList L1, L2;

	if (InitList(L1)) 
	{
		printf("L1初始化成功.\n");
	}
	else 
	{
		printf("L2初始化失败!\n");
	}

	if (InitList(L2)) 
	{
		printf("L2初始化成功!\n");
	}
	else 
	{
		printf("L2初始化失败!\n");
	}

	printf("请输入L1的长度:");
	int len1;
	scanf("%d", &len1);
	CreateList(L1, len1);
	printf("遍历L1:\n");
	TraveList(L1);

	printf("请输入L2的长度:");
	int len2;
	scanf("%d", &len2);
	CreateList(L2, len2);
	printf("遍历表L2:\n");
	TraveList(L2);

	SqList L3;
	Combine(L1, L2, L3);
	printf("合并后的表:\n");
	TraveList(L3);

	system("pause");

	return 0;
}
  • 运行结果

3.链式有序表合并

  • 算法步骤
    • Lc指向La
    • 依次从La或Lb中“摘取”元素值较小的结点插入到Lc表的最后,直至其中一个表变空为止
    • 继续将La或Lb其中一个表的剩余结点插入在LC表的最后
    • 释放Lb表的表头结点
  • 算法描述
void Combine(LinkList &L1, LinkList &L2, LinkList &L3) 
{
	LNode *pa, *pb, *pc;
	pa = L1->next;
	pb = L2->next;
	pc = L3 = L1;  // //用L1的头结点作为L3的头结点 
	
	while (pa&&pb) 
	{
		if (pa->data <= pb->data) 
		{
			pc->next = pa;
			pc = pa;
			pa = pa->next;
		}
		else 
		{
			pc->next = pb;
			pc = pb;
			pb = pb->next;
		}
	}
	pc->next = pa ? pa : pb;  // 插入剩余段 
	
	delete L2;  // 释放L2的头结点
}
  • 代码实现
  • main.cpp
#include<stdio.h>
#include<iostream>
using namespace std;
#define MAX 100

typedef struct LNode 
{
	int data;
	struct LNode *next;
}LNode, *LinkList;

int InitList(LinkList &L) 
{
	L = new LNode;
	L->next = NULL;
	return 1;
}

void TraveList(LinkList L) 
{
	struct LNode *p;
	p = L->next;
	
	while (p) 
	{
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");
}

void CreateList(LinkList &L, int n) 
{
	L = new LNode;
	L->next = NULL;
	LNode *r;
	r = L;
	
	printf("请输入链表的元素:\n");
	for (int i = 0; i < n; i++)
	{
		LNode *p;
		p = new LNode;
		printf("请输入第%d个元素的值:", i+1);
		scanf("%d", &p->data);
		p->next = NULL;
		r->next = p;
		r = p;
	}
}

void Combine(LinkList &L1, LinkList &L2, LinkList &L3) 
{
	LNode *pa, *pb, *pc;
	pa = L1->next;
	pb = L2->next;
	pc = L3 = L1;  // //用L1的头结点作为L3的头结点 
	
	while (pa&&pb) 
	{
		if (pa->data <= pb->data) 
		{
			pc->next = pa;
			pc = pa;
			pa = pa->next;
		}
		else 
		{
			pc->next = pb;
			pc = pb;
			pb = pb->next;
		}
	}
	pc->next = pa ? pa : pb;  // 插入剩余段 
	
	delete L2;  // 释放L2的头结点
}

int main()
{
	LinkList L1, L2, L3;

	if (InitList(L1)) 
	{
		printf("L1初始化成功!\n");
	}
	else
	{
		printf("L1初始化失败!\n");
	}

	if (InitList(L2)) 
	{
		printf("L2初始化成功!\n");
	}
	else {
		printf("L2初始化失败!\n");
	}

	if (InitList(L3)) 
	{
		printf("L3初始化成功!\n");
	}
	else 
	{
		printf("L3初始化失败!");
	}

	printf("请输入L1的长度:");
	int n1;
	scanf("%d", &n1);
	CreateList(L1, n1);
	printf("遍历L1:\n");
	TraveList(L1);

	printf("请输入L2的长度:");
	int n2;
	scanf("%d", &n2);
	CreateList(L2, n2);
	printf("遍历L2:\n");
	TraveList(L2);

	Combine(L1, L2, L3);
	printf("合并后的表:\n");
	TraveList(L3);

	system("pause");

	return 0;
}
  • 运行结果

​​​​​​​

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构—有序表的合并 的相关文章

随机推荐

  • Ubuntu(20.4)新装系统应该做的几件事

    一 配置root密码 sudo passwd 二 修改主机名 hostname 主机名 hostname 是在操作系统的安装过程中设置的 xff0c 或者在创建虚拟机时动态分配给虚拟机的 本指南说明了如何在Ubuntu 20 04上设置或更
  • Linux作为主力机--Manjaro 22.0.4

    1 对操作系统的看法 个人是做软件开发的 xff0c 已经使用Manjaro作为主力机两年多了 xff0c 真的是特别喜欢这个操作系统 经过两年的打磨 xff0c 个人16年的惠普老电脑加上这个Manjaro 22 0 4操作系统完全可以再
  • Git回退代码到某次commit

    前言 工作中 xff0c Git的使用越来越频繁 除了最常用的clone add commit push pull等命令 xff1b 还有回退命令reset 这一篇博客就记录一下该回退命令的简单使用 场景 因为公司开发过程中 xff0c 处
  • java位运算(一),了解二进制与八进制,十进制以及16进制的转换

    先放上0 15的各种进制转换码 xff0c 方便做个简单的比较 0 15 十进制 0 1 2 3 4 5 6 7 8 9 10 1112131415二进制 xff08 binary xff09 0 1 10 11 100 101 110 1
  • matlab中interp2双线性插值算法的实现原理及使用python简单实现双线性插值interp2算法

    双线性插值算法基本原理 双线性插值算法的基本原理 xff1a 图1 双线性插值示意图 图中绿色的点P为待插值得到的点 xff0c 对点P进行插值需要用到Q11 x1 y1 Q12 x1 y2 Q21 x2 y1 Q22 x2 y2 的值 x
  • Linux 运行shell文件,出现 $‘\r‘: command not found

    运行编写的shell脚本时 xff0c 出现了 r command not found 这样的错误提示 报错的原因是我们在windows系统操作时 xff0c 编辑器里的换行符是 r n xff0c 而Linux上为 n xff0c 两个系
  • [Swoole] 在Ubuntu下安装、快速开始

    本文主要讲述在 Ubuntu 下编译安装 Swoole xff0c 并根据官方文档给出的demo进行了测试和搬运 xff0c 包括 xff1a TCP服务器 UDP服务器 HTTP服务器 WebSocket服务器 异步客户端 定时器和协程相
  • C++ 快速幂取模算法

    快速求 b p k的值 1 模运算与乘法的性质 乘积取模可以在乘之前先取模 x y d 61 x d y d d 比如 xff1a a a c 61 a c a c c 2 本题公式 当 b为偶数时 xff1a ab mod c 61 a2
  • [Python] socket实现TFTP上传和下载

    Python socket实现TFTP上传和下载 一 说明二 TFTP协议介绍 xff08 参考网络 xff0c 详情可搜索 xff09 2 1 特点 2 2 TFTP下载过程分析 xff1a 2 3 TFTP操作码与数据格式 xff1a
  • [Python] 通过采集两万条数据,对《无名之辈》影评分析

    一 说明 本文主要讲述采集猫眼电影用户评论进行分析 xff0c 相关爬虫采集程序可以爬取多个电影评论 运行环境 xff1a Win10 Python3 5 分析工具 xff1a jieba wordcloud pyecharts matpl
  • [Python] 用python做一个游戏辅助脚本,完整思路

    一 说明 简述 xff1a 本文将以4399小游戏 宠物连连看经典版2 作为测试案例 xff0c 通过识别小图标 xff0c 模拟鼠标点击 xff0c 快速完成配对 对于有兴趣学习游戏脚本的同学有一定的帮助 运行环境 xff1a Win10
  • cp命令 复制多个目录/文件夹下文件到指定目录

    可以使用cp命令的通配符和递归选项来复制多个目录下多个文件夹下的文件到指定目录 如果目标目录不存在 xff0c 可以使用 mkdir p命令来创建目录 p 选项表示递归创建目录 xff0c 如果目录已经存在 xff0c 则不会报错 例如 x
  • 网络安全传输系统(3)—OpenSSL加密传输

    1 基本介绍 1 1 未加密传输的安全弊端 如果在网络传输中没有加密 xff0c 就是以明文传输 传输的数据可以被抓包软件直接截获 xff0c 并能读取里面的数据 1 2 加密基本原理 对称加密 xff1a 对称加密指的就是加密和解密使用同
  • 网络安全传输系统(4)—线程池优化

    服务器单发模式 初始化 gt 等待连接 gt 处理请求 gt 关闭连接 gt 再次等待连接服务器并发模式 初始化 gt 等待连接 gt 交给子进程处理请求 gt 再次等待连接单发服务器不能同时处理多个客户端请求 xff0c 并发服务器则可以
  • 网络安全传输系统(5)—账号管理子系统设计

    1 登录模块设计 输入用户名和密码根据用户名从数据库提取密码比较用户输入密码和数据库提取密码 xff0c 以决定是否登录成功 2 编译客户端程序 arm linux gcc L 008 openssl 1 0 0s install lib
  • C语言实例—一个数如果恰好等于它的因子之和,这个数就称为完数。(gcc编译)

    1 题目 一个数如果恰好等于它的因子之和 xff0c 这个数就称为完数 例如 xff0c 6的因子是1 xff0c 2 xff0c 3 xff0c 而6 61 1 43 2 43 3 xff0c 因此6为完数 编程序找出1000之内所有的完
  • C语言实例—输入两个正整数m和n,求其最大公约数和最小公倍数(gcc 编译)。

    1 辗转相除法 辗转相除法是古希腊求两个正整数的最大公约数的 xff0c 也叫欧几里德算法 xff0c 其方法是用较大的数除以较小的数 xff0c 上面较小的除数和得出的余数构成新的一对数 xff0c 继续做上面的除法 xff0c 直到出现
  • Linux线程详解

    并行和并发的区别 1 并发 concurrency xff1a 在操作系统 中 xff0c 是指一个时间段中有几个程序都处于已启动运行到运行完毕之间 xff0c 且这几个程序都是在同一个处理机上运行 其中两种并发关系分别是同步 和互斥 xf
  • 数据结构—带头结点的单循环链表

    1 基本操作 循环链表的特点是最后一个元素的指针域指向头结点 因此对于循环链表的初始化 xff08 设表的头结点是L xff0c 不再是L gt next 61 NULL xff0c 而是L gt next 61 L 循环链表为空时 xff
  • 数据结构—有序表的合并

    1 有序表合并 问题描述 xff1a 已知线性表La 和Lb中的数据元素按值非递减 有序排列 xff0c 现要求将La和Lb归并为一个新的线性表Lc xff0c 且Lc中的数据元素仍按值非递减有序排列 例如 xff1a La 61 1 7