手把手教数据结构与算法:有序线性表设计(表合并)

个人主页:

想转码的电筒人

专栏:

手把手教数据结构与算法

文章目录

有序线性表

概念

结构

问题描述

输入

输出

样例

解题步骤

结点类

链表类

insert函数

printAll函数

merge函数

test函数

完整代码


有序线性表

概念

单链表是一种物理存储结构上非连续、非顺序的存储结构,但链表在逻辑上是连续的,顺序的,而数据元素的逻辑顺序是通过链表中的指针连接次序实现的。

结构

单链表是由一个个结点组成的,结点如下图所示:

注意:单链表中的最后一个结点的next指向空,next=NULL,一个个结点串联组成了链表。

上图是为了方便大家理解,才用线条连接了结点,实际上在内存中,每个结点可能会隔得很远,每个结点右半部分就是这个结点的地址,很明显能看到这两个结点的地址并不是相邻的,因此也验证了顺序表在逻辑结构上确实是连续的,但在物理存储结构上确实是不连续的。

链表的基本操作

1.插入操作(Insert): 在指定节点之后插入新节点

2.删除操作(Delete): 删除指定位置的节点

3.访问操作(Access):获取链表中指定位置的节点值

4.获取长度(GetLength):获取链表的长度

5.搜索操作(Search): 判断链表中是否包含指定的值,搜索指定值在链表中的位置(索引)。

6.其他操作

反转链表(Reverse):将链表中的节点顺序颠倒过来。

合并链表(MergeLists):将两个链表合并成一个链表。

切分链表(SplitList):将链表从指定位置切分成两个链表。

环检测(HasCycle):检测链表中是否存在环。 找出链表中点(FindMiddle):返回链表的中间节点

有序线性表(Ordered Linear List)也是一种链表,其中的元素按照某种顺序排列。通常,这种顺序是指元素按照某个关键字的大小进行排序,下面让我们一起实现它。

问题描述

设计一个有序线性表类,要求完成初始化,插入和遍历功能,使得表内元素实现有序排列(从小到大)。同时实现合并功能,使得两个线性表能够合并为一个线性表(可能存在重复元素)。

  • 要求使用链表和泛型编程。
  • 注:不要忘了回收指针。
输入

第一行输入字符串 dtype(“int”或者”float”)表示数据存储类型。
第二行输入 int 型数据 N1(N1≥0),代表第一个线性表元素数量;
第三行输入 N1 个 dtype 型数据,每个数据由空格隔开;
第四行输入 int 型数据 N2(N2≥0),代表第二个线性表元素数量;
第五行输入 N2 个 dtype 型数据,每个数据由空格隔开;

输出

遍历第一个线性表,第一行输出其遍历结果,每个数据由空格隔开。
遍历第二个线性表,第二行输出其遍历结果,每个数据由空格隔开。
第三行输出第一个线性表和第二个线性表合并后的遍历结果,每个数据由空格隔开。

  • 注:线性表为空时仅输出换行符,每行输出的末尾没有空格。
样例

输入:

int
7 15 24 0 13 7 15 8
3 15 1 2

输出:

0 7 8 13 15 15 24
1 2 15
0 1 2 7 8 13 15 15 15 24

解题步骤

结点类

首先是链表的结点设计,可以设计出结构体 Node 表示结点,其中包含有 data 域和 next 指针,如下图:


其中 data 表示数据,其可以是简单的类型,也可以是复杂的结构体,故采用泛型编程template<typename T>。next 指针表示,下一个的指针,其指向下一个结点,通过 next 指针将各个结点链接。结点类还有构造函数,在创建结点时可以进行初始化,

template <typename T>
struct Node
{Node* next;T value;
};
链表类

链表只需要头指针用来指向链表的起点,构造函数只需让head指向空结点,析构函数则用来删除链表中所有的结点

class List
{
public:Node<T>* head;List() : head(nullptr) {head = new Node<T>;head->next = nullptr;};~List(){Node<T>* p;while (head != nullptr){p = head;head = head->next;delete p;}}
};
insert函数

向队列中插入一个节点,值为value,使得表内元素实现有序排列(从小到大)

在链表中插入结点时,若链表为空,则将该新结点作为空结点,若链表不为空,题目要求该链表为有序线性表,故需要先通过比较新插入的结点值与链表结点值,找到结点插入的位置再进行插入

void insert(T value)
{Node<T>* p = head;              //获得头节点指针    Node<T>* node = new Node<T>;    //创建新的节点node->value = value;node->next = nullptr;Node<T>* tem = head;if (p == nullptr) p->value = value;for (; p != nullptr;){if (node->value > p->value){tem = p;p = p->next;}else{node->next = tem->next;tem->next = node;break;}}if (tem && tem->next != node){tem->next = node;}
}
printAll函数

遍历并输出线性表

从头指针开始遍历即可。通过一个指针从链表的第一个元素开始,依次遍历每个节点,并输出节点的值。最终在打印完成后输出换行符。

void printAll()/*函数名:printAll输入值:无功  能:遍历并输出线性表*/
{Node<T>* p = head->next;if (p == nullptr){cout << endl;return;}for (; p->next != nullptr;){cout << p->value << " ";p = p->next;}cout << p->value;cout << endl;
}
merge函数

合并两个线性表

遍历线性表2,使用insert函数将表2的结点插入表1,即可实现表1和表2的合并

void merge(List<T>* l2)
{Node<T>* p = l2->head->next;for (; p != nullptr;){insert(p->value);p = p->next;}
}
test函数

调用链表函数完成题目要求

void test()
{int N1, N2;T value;List<T> l1, l2;cin >> N1;for (; N1 > 0; N1--){cin >> value;l1.insert(value);}l1.printAll();cin >> N2;for (; N2 > 0; N2--){cin >> value;l2.insert(value);}l2.printAll();l1.merge(&l2);l1.printAll();
}

完整代码

#include <iostream>
using namespace std;
template <typename T>
struct Node
{Node* next;T value;
};
template <typename T>
class List
{
public:Node<T>* head;List() : head(nullptr) {head = new Node<T>;head->next = nullptr;};~List(){Node<T>* p;while (head != nullptr){p = head;head = head->next;delete p;}}void insert(T value){Node<T>* p = head;              //获得头节点指针    Node<T>* node = new Node<T>;    //创建新的节点node->value = value;node->next = nullptr;Node<T>* tem = head;if (p == nullptr) p->value = value;for (; p != nullptr;){if (node->value > p->value){tem = p;p = p->next;}else{node->next = tem->next;tem->next = node;break;}}if (tem && tem->next != node){tem->next = node;}}void printAll(){Node<T>* p = head->next;if (p == nullptr){cout << endl;return;}for (; p->next != nullptr;){cout << p->value << " ";p = p->next;}cout << p->value;cout << endl;}void merge(List<T>* l2){Node<T>* p = l2->head->next;for (; p != nullptr;){insert(p->value);p = p->next;}}
};
template <typename T>
void test()
{int N1, N2;T value;List<T> l1, l2;cin >> N1;for (; N1 > 0; N1--){cin >> value;l1.insert(value);}l1.printAll();cin >> N2;for (; N2 > 0; N2--){cin >> value;l2.insert(value);}l2.printAll();l1.merge(&l2);l1.printAll();
}
int main()
{string dtype;cin >> dtype;if (dtype == "int")test<int>();elsetest<float>();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3018970.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

面试题:返回倒数第k个节点(简单)

面试题&#xff1a;返回倒数第k个节点&#xff08;简单&#xff09; 面试题 02.02. 返回倒数第 k 个节点 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/kth-node-from-end-of-list-lcci/description/ 这一题是很简单的当做试手题 题目 题目分析 1&…

hive日常使用时忘记部分补充(不定时)

1、date_formate、unix_timestamp、from_unixtime用法&#xff1a; 2、lag&#xff08;&#xff09;、lead()用法&#xff1a; lag&#xff08;)窗口函数返回分区中当前行之前行&#xff08;可以指定第几行&#xff09;的值。 如果没有行&#xff0c;则返回null。 lead()窗口…

windows端口复用

1. 概述 使用 HTTP.sys 中的 Net.tcp Port Sharing 服务&#xff0c;配合 WinRM 实现端口复用。 优点&#xff1a; HTTP.sys 为 windows 原生机制&#xff0c; WinRM 为 windows 自带功能&#xff0c;动作较小&#xff0c;不易触发主 动防御。 需要管理员权限。 2. 原理 (…

定时任务相关:克戎表达式

克戎表达式的历史和概念 克戎表达式&#xff08;Cron Expression&#xff09;是一种用于表示定时任务的字符串格式&#xff0c;在计算机领域被广泛应用。它的历史可以追溯到UNIX系统&#xff0c;最早由Brian Kernighan与其他UNIX开发者在1970年代末和1980年代初开发。 克戎表…

matlab绘制时间序列图,横坐标轴如何标注为月-日

Excel表格中有类似于如下 年月日对应的数据 导入 matlab中&#xff0c;为数值矩阵&#xff1b;了解该表格中的时间跨度为从2021年1月2日至2021年12月31日&#xff0c;中间没有缺失&#xff0c;绘图代码&#xff1a; % clear; timespan1[20210102 20211231]; datenn1datenum(da…

[虚拟机+单机]梦幻契约H5修复版_附GM工具

本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行的&#xff0c;踩过的坑都给你们填上了 视频演示 [虚拟机单…

关于电商API接口【满足高并发大批量请求】||电商API接口入门指南

简介&#xff1a; API&#xff08;应用程序编程接口&#xff09;是一种让不同软件之间进行通信的方式。在电子商务中&#xff0c;电商API接口可以用于获取商品信息、下单、支付等等。本篇文章将介绍电商API接口的入门知识&#xff0c;并提供示例代码以帮助你快速上手。 一、了解…

一路串联电机的绕制原理

这里要说明的一点是 对于一路串联的电机&#xff0c;无论是一把线圈还是两把线圈&#xff0c;出来的都是只有两个线头&#xff0c;可看做一个整体来对待&#xff01; 绕制具体原理 同心式线圈绕制 前面说的都是等距式的 线圈绕制&#xff0c;下面我们讲解一下同心式的绕制办法…

【自动驾驶|毫米波雷达】逻辑化讲解测角全流程

第一次更新&#xff1a;2024/5/7 目录 一. 引入 基础概念 二. 测角原理 1. 接收天线不同位置 2. 角度几何关系 3. 角度正负规定 4. 角度测量 5. 最大不模糊角 三. 角度分辨率 1. 相位变化量 2. 角度表示 3. 角度变化量 三. 测角算法 1. 三维快速傅里叶变换 (3D-FFT&…

广州厂房工业冷风机如何通风降温呢?

工业冷风机通过以下方式实现通风降温&#xff1a;风力循环&#xff1a;工业冷风机通过强力的风扇系统产生强大的风力&#xff0c;这个风力循环可以有效地将热量从工作区域带走。具体来说&#xff0c;它可以将室内热空气吹出&#xff0c;同时带入室外的新鲜空气。这种持续的空气…

五款加密软件的对比分析|加密软件怎么选

从企业防泄密角度来说&#xff0c;加密软件是最有效的解决方案之一&#xff0c;通过对内部核心文档、图纸、代码、视频等各类文件进行加密。可以有效防止文件外发泄密、窃取、设备丢失导致的数据泄露。 下面主要对五款加密软件进行对比分析&#xff0c;帮助你快速选择一个适合…

|Python新手小白中级教程|第二十三章:列表拓展之——元组

文章目录 前言一、列表复习1.索引、切片2.列表操作字符3.数据结构实践——字典 二、探索元组1.使用索引、切片2.使用__add__((添加元素&#xff0c;添加元素))3.输出元组4.使用转化法删除元组指定元素5.for循环遍历元组 三、元组VS列表1.区别2.元组&#xff08;tuple&#xff0…

.NET邮箱API发送邮件的步骤?怎么配置API?

.NET邮箱API发送邮件需要注意哪些&#xff1f;如何使用API发信&#xff1f; 在.NET环境中&#xff0c;使用邮箱API发送邮件是一个常见的需求。无论是企业级的邮件通知&#xff0c;还是个人项目中的邮件验证&#xff0c;都少不了.NET邮箱API的帮助。下面&#xff0c;AokSend将详…

【从零开始学架构 架构基础】架构设计的本质、历史背景和目的

本文是《从零开始学架构》的第一篇学习笔记&#xff0c;主要理解架构的设计的本质定义、历史背景以及目的。 架构设计的本质 分别从三组概念的区别来理解架构设计。 系统与子系统 什么是系统&#xff0c;系统泛指由一群有关联的个体组成&#xff0c;根据某种规则运作&#…

领域驱动设计架构演进

领域驱动设计由于其强调对领域的深入理解和关注业务价值,其架构演进依赖于领域的变化和特定领域中的技术实践。 初始阶段 一个单体架构,所有的功能都集成在一个应用程序中,领域模型可能还不完全清晰,甚至并未形成。这个阶段主要是为了验证产品的可行性,快速迭代并尽快推…

mysql查询表信息(表名、表结构、字段信息等)

MySQL中&#xff0c;您可以使用以下SQL查询数据库的表信息或者某个表中具体的信息&#xff0c;例如&#xff1a;字段、字段描述、索引等&#xff0c;以下为具体的SQL&#xff1a; 1、查询数据库所有表信息&#xff08;表名/表描述&#xff09; SELECTtable_name name,TABLE_C…

在Altium Designer 实现元器件旋转45°放置

在Preferences >> PCB Editor >> General中将Rotation Step&#xff08;旋转的步进值&#xff09;由90改为45&#xff0c;这样以后每次按空格键旋转器件时旋转角度为45。

【k8s多集群管理平台开发实践】十、client-go实现读取pvc列表、pv列表、storageclass列表

文章目录 简介 一.k8s读取pvc列表1.1.controllers控制器代码1.2.models模型代码 二.k8s读取pv列表2.1.controllers控制器代码2.2.models模分代码 三.k8s读取storageclass列表3.1.controllers控制器代码3.2.models模型代码 四.路由设置4.1.路由设置 五.前端代码5.1.pvc列表的htm…

内网穿透使用教程

什么是内网穿透 内网穿透&#xff0c;即NAT穿透&#xff0c;网络连接时术语&#xff0c;计算机是局域网内时&#xff0c;外网与内网的计算机节点需要连接通信&#xff0c;有时就会出现不支持内网穿透。就是说映射端口&#xff0c;能让外网的电脑找到处于内网的电脑&#xff0c…

算法学习008-登山爬石梯 c++动态规划/递归算法实现 中小学算法思维学习 信奥算法解析

目录 C登山爬石梯 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 C登山爬石梯 一、题目要求 1、编程实现 小明周末和朋友约好了一起去爬山&#xff0c;来到山下&#xff0c;发现登山道是…