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

问题描述

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

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

第一行输入字符串 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

解题步骤

结点类

该题需采用泛型编程,故定义结点类时需要使用模板

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://www.mzph.cn/web/2324.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【java】27:java绘图

坐标体系 - 介绍&#xff1a; 下图说明了Java坐标系。坐标原点位于左上角&#xff0c;以像素为单位。在Java坐标系中&#xff0c;第一个是x坐标&#xff0c;表示当前位置为水平方向&#xff0c;距离坐标原点个像素&#xff1b;第二个是y坐标&#xff0c;表示当前位置为垂直方向…

HTML使用jQuery实现两个点击按钮,分别控制改文本字体颜色和字体大小

jQuery 简介 jQuery 是一个广泛使用的 JavaScript 库&#xff0c;旨在简化对 HTML 文档的操作、事件处理、动画效果和 AJAX 等操作。 案例源码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name&q…

毕业撒花 流感服务小程序的设计与实现

目录 1.1 总体页面设计 1.1.1 用户首页 1.1.2 新闻页面 1.1.3 我的页面 1.1.5 管理员登陆页面 1.1.6 管理员首页 1.2 用户模块 1.2.1 体检预约功能 1.2.2 体检报告功能 1.2.4 流感数据可视化功能 1.2.5 知识科普功能 1.2.6 疾病判断功能 1.2.7 出示个人就诊码功能 …

【笔试强训】day9

1.添加逗号 思路&#xff1a; 没思路 代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include<string> #include<algorithm> using namespace std;int main() {string a;cin >> a;string ans;int p 1;for (int i a.si…

J8 inceptionv1

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 卷积神经网络大家族中有很多经典的网络&#xff0c;前面已经学习resnet,densenet相关网络&#xff0c;今天学习一种更久远的一种网络GoogLenet 网络结构…

【Java--数据结构】模拟实现ArrayList

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 LIst 顺序表ArrayList 顺序表优点 IList接口 ArrayList中定义要操作的数组 在MyArrayList中 重写接口方法 新增元素 在指定位置插入元素 pos不合法异常 判断和查找元素…

二维码相册怎么做?图片转换为二维码的方法

二维码现在可以用来承载大量的内容&#xff0c;通过扫描二维码即可通过扫描设备获取信息。图片生成二维码之后&#xff0c;用户可以在不保存图片直接扫码来查看图片&#xff0c;这种方式可以有效的提高图片的安全性&#xff0c;防止图片信息泄露。 怎么用二维码来作为相册展现…

STM32F401RCT6电子元器件芯片LQFP64 32位微控制器MCU单片机

STM32F401RCT6微控制器具有丰富的外设接口和较高的处理能力&#xff0c;适用于多种嵌入式应用。以下是一些典型的STM32F401RCT6应用案例&#xff1a; 1. 机器人控制&#xff1a;STM32F401RCT6可以用于制作自动导航机器人、遥控机器人等&#xff0c;负责处理传感器数据、控制电…

Centos7虚拟机与真机乎ping以及虚拟机ping不通的原因

虚拟机网络完全正常的标准 物理机可以ping通虚拟机的IP虚拟机可以ping通物理机的IP虚拟机可以ping通baidu.com等网站 使用工具版本&#xff1a;Centos7 前提&#xff1a; 虚拟机必须开机才可以连接访问 克隆出来的虚拟机一定要手动修改IP&#xff0c;IP冲突的情况下不能联网 …

android开发 使用Messenger进行进程间通信

Messenger有两个构造方法。 Messenger recevierMessenger new Messenger(IBinder target)&#xff1b; Messenger recevierMessenger new Messenger(Handler target)&#xff1b; 能传handler和ibinder&#xff0c; 服务端进程 com.jn.testmessagerservice 创建一个servic…

水位传感器优点有哪些

水位传感器是一种用于检测液体水位的重要设备&#xff0c;在各种工业和民用场景中起着至关重要的作用。其中&#xff0c;光学液位传感器作为一种先进的水位检测技术&#xff0c;在市场上备受青睐&#xff0c;其优点主要包括以下几个方面。 光学液位传感器内部所有元器件均经过…

基于一款最多能够支持10000路的 modbus RS485 led灯光控制板做灯控程序

背景 介绍一款之前用过的一款设备&#xff0c;基于RS485通讯协议&#xff0c;控制LED灯或RGB灯带。 设备介绍 之前用它来做智能中药柜的灯控板&#xff0c;结合物联网网关&#xff0c;modbus采集&#xff0c;mqtt转发&#xff0c;以及mqtt的rpc指令下发 设备图片 功能说明 …

LPA算法简介

1. 背景 标签传播算法(Label Propagation Algorithm)是一种基于图的半监督学习方法&#xff0c;其基本思路是用已标记节点的标签信息去预测未标记节点的标签信息。 2. 算法流程 1. 为每个节点随机的指定一个自己特有的标签&#xff1b; 2. 逐轮刷新所有节点的标签&#xff0…

前沿论文 | LLM推理性能优化最佳实践

原文&#xff1a;安全验证 - 知乎​ 来源 题目&#xff1a;LLM Inference Performance Engineering: Best Practices 地址&#xff1a;https://www.databricks.com/blog/llm-inference-performance-engineering-best-practices 在这篇博文中&#xff0c;MosaicML工程团队分析了…

2024-4-22 群讨论:微服务启动预热相关

以下来自本人拉的一个关于 Java 技术的讨论群。关注公众号&#xff1a;hashcon&#xff0c;私信进群拉你 Hotspot JVM 进程启动后&#xff0c;流量到来的时候 JIT 吃掉很多 CPU&#xff0c;如何观察到&#xff1f; 很多途径都能观察到&#xff1a; top -Hp&#xff1a;这个需…

ApiHug 的初心-ApiHug101

视频 秒懂 ApiHug -019 HOPE &#x1f525; H.O.P.E.: Help other people excellent &#x1f49d; 是这个项目最初的初心 &#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ &#x1f3e0; gitee github search ApiHug ApiHug &#x1f917; ApiHug {Post…

云架构(五)BBF模式

BFF模式&#xff08;Backends for Frontends pattern&#xff09;- https://learn.microsoft.com/en-us/azure/architecture/patterns/backends-for-frontends。 创建单独的后台服务用以提供给特定的前端或者接口。当你希望避免为多个接口定制单独的后台时&#xff0c;此模…

7天录用!录用→检索仅21天!CCF推荐毕业神刊

本周投稿推荐 SSCI • 2/4区经管类&#xff0c;2.5-3.0&#xff08;录用率99%&#xff09; SCIE&#xff08;CCF推荐&#xff09; • 计算机类&#xff0c;2.0-3.0&#xff08;最快18天录用&#xff09; SCIE&#xff08;CCF-C类&#xff09; • IEEE旗下&#xff0c;1/2…

限时疯抢!阿里云服务器十大优惠活动合集,手慢无

限时疯抢&#xff01;阿里云服务器十大优惠活动合集&#xff0c;手慢无阿里云服务器优惠活动&#xff08;2024年最新整理&#xff09;&#xff0c;阿里云服务器优惠活动大全、2024阿里云优惠政策整理&#xff0c;包括官方优惠活动主会场、2024年4月优惠活动分为&#xff1a;免费…

服务器(Linux、AIX)监控软件【nmon】使用

目录 1.安装 2.使用 3.使用 4.采集数据 5.查看log&#xff08;根据结果&#xff0c;生成报表&#xff09; 6.分析结果 1.安装 apt-get install nmon 2.使用 输入nmon进入下面的界面 x Use these keys to toggle statistics on/off: …