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

问题描述

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

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

第一行输入字符串 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,一经查实,立即删除!

相关文章

使用nacos的好处

1. 使用docker 发布项目时&#xff0c;如果要修改配置文件就要重新打包发布比较麻烦&#xff0c;但用nacos远程配置后&#xff0c;不需要重新打包发布&#xff0c;就可以修改配置文件&#xff0c;减少了重新发布所消耗的时间&#xff0c;提高了效率。 2. Nacos支持集群部署&am…

【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…

nginx配置不同设备访问不同地址

不同设备访问不同的网页地址 前端处理&#xff08;笨办法&#xff09; 通过navigator.userAgent就可以获取到用户的设备从而进行跳转 // 获取用户设备字符串 var userAgent navigator.userAgent;// 检测是否是移动设备 var isMobile /Mobi|Android/i.test(userAgent);// 定…

springboot springcloud gateway 中的 undertow 禁止接收trace请求(修复漏洞)

1.定义两个类&#xff1a; CustomHttpHandler.java import io.undertow.server.HttpHandler; import io.undertow.server.HttpServerExchange; import io.undertow.util.StatusCodes;public class CustomHttpHandler implements HttpHandler {private final HttpHandler next;…

Stable Diffusion是什么

稳定扩散&#xff08;Stable Diffusion&#xff09;是一种数学模型和随机过程&#xff0c;用于描述不同粒子之间的随机运动和扩散过程。它是从随机漫步&#xff08;Random Walk&#xff09;发展而来&#xff0c;并具有一些特定的性质。 在稳定扩散中&#xff0c;粒子的运动是随…

J8 inceptionv1

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

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

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

华为配置 dhcp snooping

1、开启snooping功能前必须先全局开启dhcp的功能 [HUAWEI] dhcp enable //全局开启 2、全局开启snooping功能 [HUAWEI] dhcp snooping enable ipv4 //全局单独开启IPv4的snooping功能&#xff0c;这样将能够有效的节约设备的CPU利用率 3、接口或VLAN下开启DH…

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

二维码现在可以用来承载大量的内容&#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冲突的情况下不能联网 …

hbase安装

安装 前置条件 需要启动Hadoop 并需要验证状态信息需要启动Zookeeper 并需要验证状态信息 在master上传jar包并解压 tar -zxvf hbase-2.1.9-bin.tar.gz 配置环境变量 export HBASE_HOME/usr/local/soft/hbase-2.1.9 export PATH H B A S E H O M E / b i n : HBASE_HOME/bin:…

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;其优点主要包括以下几个方面。 光学液位传感器内部所有元器件均经过…

如果使用0x对node项目进行性能分析

0x 是一个强大的 Node.js 性能分析工具&#xff0c;它可以帮助你进行堆栈追踪和火焰图分析。使用 0x 可以帮助你理解 Node.js 应用在运行时的性能瓶颈&#xff0c;进而优化代码。以下是如何使用 0x 对 Node.js 项目进行性能分析的步骤&#xff1a; 安装0x 首先&#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…