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

news2025/3/9 10:55:26

问题描述

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

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

第一行输入字符串 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>();
    else
        test<float>();
    return 0;
}

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

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

相关文章

Redis中的缓存击穿、缓存穿透、缓存雪崩问题

1.什么是缓存击穿&#xff1f; 客户端恶意访问一个不存在的数据&#xff0c;从而造成穿透缓存&#xff0c;请求直接到达数据库&#xff0c;频繁的发送这一类的请求&#xff0c;直接查询数据库&#xff0c;数据库的压力变大。 1.1如何解决缓存击穿呢&#xff1f; 1&#xff0…

世界读书日,想变自律,听书690本的我最推荐的3本书

前言 今天是世界读书日&#xff0c;如果你曾经买了健身卡没有坚持下来&#xff0c;想减肥却管不住嘴&#xff0c;迈不开腿&#xff0c;想养成好习惯&#xff0c;解决自律问题。作为听书 690 本的我最推荐的3本书。 Top3书籍&#xff1a;《微习惯》《原子习惯》《福格行为模型》…

【笔试强训】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…

通过“命令提示符(cmd)”注销后台帐号用户

通过“命令提示符&#xff08;cmd&#xff09;”注销后台帐号用户 1 2 3 4 分步阅读 电脑上面后台使用的用户较多&#xff08;包括远程连接&#xff09;&#xff0c;电脑的运行负荷将会增加&#xff0c;电脑响应缓慢&#xff0c;甚至会影响到正常的使用&#xff0c…

架构师系列-MYSQL调优(八)- 索引多表优化案例

用户手机认证表 该表约有11万数据,保存的是通过手机认证后的用户数据关联字段: user_id CREATE TABLE mob_autht (id int(11) NOT NULL AUTO_INCREMENT COMMENT 标识,user_id int(11) NOT NULL COMMENT 用户标识,mobile varchar(11) NOT NULL COMMENT 手机号码,seevc_pwd varc…

海康智能相机FTP本地存图流程

背景&#xff1a;近期一个新项目需要使用到智能相机&#xff0c;借助智能相机算法直接输出检测结果并将相机图像进行本地化保存和展示。由于申购目标智能相机未到&#xff0c;暂时使用测试智能相机。 目标智能相机型号&#xff1a;海康智能相机MV-SC3050XC 当前测试相机型号…

【计算机毕业设计】影院管理系统产品功能介绍——后附源码

&#x1f389;**欢迎来到我的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 一名来自世界500强的资深程序媛&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于…

如何在PostgreSQL中设置自动清理过期数据的策略

文章目录 方法一&#xff1a;使用临时表和定期清理步骤&#xff1a;示例代码&#xff1a;创建临时表&#xff1a;定期清理脚本&#xff08;bash psql&#xff09;&#xff1a; 方法二&#xff1a;使用分区表和定期清理步骤&#xff1a;示例代码&#xff1a;创建分区表&#xf…

ZY1-02D (ZY1E)多光谱数据预处理

卫星介绍 资源一号02D卫星&#xff08;5米光学卫星&#xff09;于2019年9月12日成功发射&#xff0c;卫星搭载的两台相机&#xff0c;可有效获取115公里幅宽的9谱段多光谱数据以及60公里幅宽的166谱段高光谱数据&#xff0c;其中全色谱段分辨率可达2.5米、 多光谱为10米、高光谱…

【图文教程】在PyCharm中导入Conda环境

文章目录 &#xff08;1&#xff09;在Anaconda Prompt中新建一个conda虚拟环境&#xff08;2&#xff09;使用PyCharm打开需要搭建环境的项目&#xff08;3&#xff09;配置环境 &#xff08;1&#xff09;在Anaconda Prompt中新建一个conda虚拟环境 conda create - myenv py…

数据分析专家能力模型

招式&#xff1a;懂商业&#xff08;业务能力&#xff09; 外功更偏重于技能&#xff0c;首先需要懂招式&#xff0c;即懂商业&#xff0c;数据分析最终是为业务服务的&#xff0c;无论是互联网企业准求的用户增长和UJM分解&#xff0c;还是传统企业追求的降本增效和精细化运营…

Linux多进程(一)创建进程与进程控制

一、进程状态 进程一共有五种状态分别为&#xff1a;创建态&#xff0c;就绪态&#xff0c;运行态&#xff0c;阻塞态(挂起态)&#xff0c;退出态(终止态)其中创建态和退出态维持的时间是非常短的&#xff0c;稍纵即逝。主要是就绪态, 运行态, 挂起态三者之间的状态切换。 就绪…

视频不够清晰怎么办?教你几种有效方法

在我们日常生活中&#xff0c;有时候我们会遇到不清晰的视频&#xff0c;这给我们带来了很多不便。那么&#xff0c;怎么将不清晰的视频变清晰呢&#xff1f;本文将为您介绍一些常用的软件工具&#xff0c;帮助您提升视频的清晰度。 方法一&#xff1a;使用AI技术 AI技术可以通…

低视力者出行升级:适配服务助力双手解放与环境感知

作为一名资深记者&#xff0c;我有幸深入了解并记录低视力者在日常出行中所面临的挑战与解决方案。近年来&#xff0c;低视力者辅助设备适配服务提供领域的创新成果&#xff0c;尤其是结合手机应用的辅助设备&#xff0c;正在以人性化、智能化的方式&#xff0c;帮助低视力者实…

Scala 05 —— 函数式编程底层逻辑

Scala 05 —— 函数式编程底层逻辑 该文章来自2023/1/14的清华大学交叉信息学院助理教授——袁洋演讲。 文章目录 Scala 05 —— 函数式编程底层逻辑函数式编程假如...副作用是必须的&#xff1f;函数的定义函数是数据的函数&#xff0c;不是数字的函数如何把业务逻辑做成纯函…

ELK创建仪表盘

创建仪表盘步骤&#xff1a; 一、保存search二、生成饼图三、创建仪表盘 一、保存search 首先保存一段时间内的search&#xff0c;可以添加想要的字段&#xff0c;并保存这个search方便下次直接打开该search&#xff0c;并方便在可视化和仪表盘中使用该search. 二、生成饼图…

基于JAVA高考志愿辅助填报系统

当今社会已经步入了科学技术进步和经济社会快速发展的新时期&#xff0c;国际信息和学术交流也不断加强&#xff0c;计算机技术对经济社会发展和人民生活改善的影响也日益突出&#xff0c;人类的生存和思考方式也产生了变化。传统高考志愿辅助填报采取了人工的管理方法&#xf…

销帮帮CRM与电商运营增效的关系?

在电商运营中&#xff0c;不同部门之间往往存在信息壁垒&#xff0c;导致客户体验的不连贯。销帮帮CRM通过提供跨职能管理客户关系的共享平台和一体化工作流引擎&#xff0c;使员工能够使用正确的工具和数据更有效地管理跨业务线的客户关系&#xff0c;实现更互联的客户体验。这…

相亲平台app小程序

相亲平台app小程序是一种基于手机应用的微型程序&#xff0c;专为在线相亲交友活动设计。它提供了一系列的功能&#xff0c;旨在帮助用户更方便、更高效地找到心仪的伴侣。 首先&#xff0c;用户可以在个人资料部分上传照片、填写个人资料、设置兴趣爱好等信息&#xff0c;以便…