链表类模板list

2023-11-16

描述

设计如下样式的链表类模板list,并对其进行简单使用。

template <class T> class list{ 

//类模板 list,使用类型形参 T

    struct node { 

    //结构体 node 类型用来定义链表表项(的具体数据项)

    T data; 

    //每一表项的 data 数据域的类型由类型形参 T 所指定

    node * next; 

    //通过指针 next,将多个表项“链接”成一个链表

} *head, *tail; 

//数据成员 head 与 tail,为链表的首尾指针

public:

    list (); //构造函数,创建“空链表”

    void Insert (T item);

    //生成链表项插入到原链的链首

    void Append (T item); 

    //生成链表项附加到原链的链尾

    int count(); 

    //返回当前链表的项数

    void htot(); 

    //把链表首项移到链尾

    void ttoh(); 

    //把链表尾项移到链首

    void display();

     //将各链表项数据 data 显示在屏幕上

};

八个成员函数的具体功能描述如下:

1. list ();

构造函数,将 head 与 tail 均置为 NULL,意味着创建出一个“空链表”。

2. void Insert (T item);

动态生成一块链表项空间,并将 T 类型的数据 item 放入该链表项的 data 域,而后将新生成的该链表项插入到原链的链首(链表的“栈”式用法)。

3. void Append (T item);

动态生成一块链表项空间,并将 T 类型的数据 item 放入该链表项的 data 域,而后将新生成的该链表项附加到原链的链尾(链表的“队列”式用法)。

4. int count();

“数出”并返回当前链表的数据项数:空链时返回 0;链表非空时,意味着要“遍历”链表,即从头到尾“数”出链表的项数后返回。

5. void htot();

把链表首项移到链尾:空链或仅一项时无须移动;否则,要将原链首项“接到”其尾项之后,而后马上调整新链首指针 head 以及新链尾指针 tail。

6. void ttoh();

把链表尾项移到链首:空链或仅一项时无须移动;否则,要将原链尾项“挪到”链首,而后马上调整新链首指针 head 以及新链尾指针 tail。

7. void display();

将各链表项数据 data 显示在屏幕上:空链时输出"emptylist";否则要对链表进行“遍历”,从头到尾逐项对其 data 数据进行显示(输出元素之间用一个空格隔开)。

要求:在主函数中,需要创建两个链表link1和link2,将输入的所有链表元素依次通过Append加到link1中,并依次通过Insert加到link2中。

输入

输入一共有三行,第一行为链表类型 (只需考虑int/char,均为小写即可);

第二行为链表长度;

第三行依次输入链表元素。

输出

输出有六行,第一行为link1.count()的结果;

第二行为link1.display()的结果;

第三行为link1经过ttoh()后,link1.display()的结果;

第四行为link2.count()的结果;

第五行为link2.display()的结果;

第六行为link2经过htot()后,link2.display()的结果。

样例输入

int

5

1 2 3 4 5

样例输出

5

1 2 3 4 5

5 1 2 3 4

5

5 4 3 2 1

4 3 2 1 5

#include<iostream>
#include<string>
using namespace std;
template <class T> class list { 
    struct node { 
        T data; 
        node * next; 
    } *head, *tail;
public:
    list();
    void Insert(T item); 
    void Append(T item); 
    int count();
    void htot(); 
    void ttoh();
    void display(); 
};

template <class T> list<T>::list() {
    head = NULL;
    tail = NULL;
}

template <class T> void list<T>::Append(T item) {
    node *p;
    p = new node;
    p->data = item;
    p->next = NULL;
    if (tail) {
        tail->next = p;
    }
    tail = p;
    if (head == NULL) {
        head = tail;
    }
}

template <class T> void list<T>::Insert(T item) {
    node *p;
    p = new node;
    p->data = item;
    p->next = NULL;
    if (head) {
        p->next = head;
    }
    head = p;
    if (tail == NULL) {
        tail = head;
    }
}

template <class T> int list<T>::count() {
    node *p = head;
    int num = 0;
    while (p) {
        num++;
        p = p->next;
    }
    return num;
}

template<class T> void list<T>::htot() {
    if (tail != NULL) {
        tail->next = head;
        tail = head;
        head = head->next;
        tail->next = NULL;
    }
}

template<class T> void list<T>::ttoh() {
    node *q, *p = head;
    q = p;
    if (p != NULL) {
        while (p->next) {
            q = p;
            p = p->next;
        }
        tail->next = head;
        head = tail;
        tail = q;
        tail->next = NULL; 
    }
}

template<class T> void list<T>::display() {
    node *p = head;
    while (p) {
        cout << p->data;
        p = p->next;
        if (p != NULL) {
            cout << " ";
        }
    }
    if (head == NULL) {
        cout << "emptylist";
    }
    cout << endl;
}


int main() { 

    string type;
    cin >> type;

    if (type == "char") {
        list <char> link1;
        list <char> link2;
        int num;
        cin >> num;
        for (int i = 0; i < num; i++) {
            char d;
            cin >> d;
            link1.Append(d);
            link2.Insert(d);
        }

        cout << link1.count() << endl;
        link1.display();
        link1.ttoh();
        link1.display();

        cout << link2.count() << endl; 
        link2.display(); 
        link2.htot();
        link2.display();
    }
    if (type == "int") {
        list <int> link1;
        list <int> link2;
        int num;
        cin >> num;
        for (int i = 0; i < num; i++) {
            int d; 
            cin >> d;
            link1.Append(d);
            link2.Insert(d);
        }
        cout << link1.count() << endl;
        link1.display();
        link1.ttoh();
        link1.display();

        cout << link2.count() << endl; 
        link2.display(); 
        link2.htot(); 
        link2.display();
    }
return 0;
}

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

链表类模板list 的相关文章

  • C++ 维护子类对象的混合集合

    如果我在这里错过了一个相当基本的概念 我很抱歉 但我正在尝试弄清楚如何维护多个类类型的集合 所有类类型都派生自同一个父类 并且在检索它们时仍然可以访问它们的特定于子类的方法从集合中 作为上下文 我有一个基类 BaseClass 和许多类 例
  • CLR 2.0 与 4.0 性能比较?

    如果在 CLR 4 0 下运行 为 CLR 2 0 编译的 NET 程序会运行得更快吗 应用程序配置
  • 以编程方式读取 SQL Server 查询计划建议的 SQL 特定执行的索引?

    如果我在 SSMS 中运行此命令 set showplan xml on GO exec some procedure arg1 arg2 arg3 GO set showplan xml off GO 我获得查询执行中涉及的完整调用堆栈的
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • 当一组凭据下的计划任务启动的进程在另一组凭据下运行另一个程序时,Windows 是否有限制

    所以我有一个简单的例子 其中我有应用程序 A 它对用户 X 本地管理员 有一些硬编码的凭据 然后它使用硬编码的绝对路径启动带有这些凭据的应用程序 B A 和 B 以及 dotnet 控制台应用程序 但是它们不与控制台交互 只是将信息写入文件
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 为什么从字典中获取时会得到 Action<> 的克隆?

    我有以下字典 private Dictionary
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 这个可变参数模板示例有什么问题?

    基类是 include
  • 如何在richtextbox中使用多颜色[重复]

    这个问题在这里已经有答案了 我使用 C windows 窗体 并且有 richtextbox 我想将一些文本设置为红色 一些设置为绿色 一些设置为黑色 怎么办呢 附图片 System Windows Forms RichTextBox有一个
  • 如何使用 C++11 using 语法键入定义函数指针?

    我想写这个 typedef void FunctionPtr using using 我该怎么做呢 它具有类似的语法 只不过您从指针中删除了标识符 using FunctionPtr void 这是一个Example http ideone

随机推荐

  • 入门级详细USB移植教程——致正在为USB烦恼的朋友

    同上一篇MPU6050一样 我还是写一篇关于USB的帖子 在圈圈等玩USB的大神面前 我掌握的USB知识实在是九牛一毛 所以这篇帖子加上了入门级的修饰语 写这篇帖子主要是为了那些想快速开发USB的人 至于想深入了解USB协议 可以先学完我这
  • 游戏开发unity编辑器扩展知识系列:AssetDatabase.SaveAssets

    插眼 总结 在Editor运行c 脚本时 可以修改资源 这时如果想要保存修改 可以调用AssetDatabase SaveAssets 参考 官方文档 https docs unity3d com ScriptReference Asset
  • 记一次ES线上异常

    记一次ES线上异常解决过程 周六线上es报警es not green 由于没有带笔记本回家并且考虑到集群容量本身就很紧张以及最近的读写压力确实很大 并没有多余的机器可以加入集群 觉得应该不会是什么大问题 就没有太多在意 周末去上班打开电脑一
  • 如何调用百度接口来实现全国的撒点效果(在这里把百度接口的文档荡到本地了)

  • LogisticRegression用户流失预测模型初探【推荐】

    什么是逻辑回归 Logistic回归与多重线性回归实际上有很多相同之处 最大的区别就在于它们的因变量不同 其他的基本都差不多 正是因为如此 这两种回归可以归于同一个家族 即广义线性模型 generalizedlinear model 这一家
  • 「c++小学期」实验题目及代码

    面向对象编程的C 和平时做题用的C 还是有差距的 实验的题目都是小题目 就都做一下吧 实验一 简单C 程序设计 1 猜价格游戏 编写C 程序完成以下功能 1 假定有一件商品 程序用随机数指定该商品的价格 1 1000的整数 2 提示用户猜价
  • 【AI with ML】第 8 章 :使用 TensorFlow 创建文本

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • styled-components设置组件属性

    问题 最近在试着用react做一个音乐播放器 在这之前其实并不了解styled components 但由于使用css in js并且想实现hover效果 百度各种解决方案后发现了styled components这个好东西 如果你看到了这
  • RGMII接口(KSZ9031)

    概述 RGMII的时序是时钟双沿采样 在默认的RGMII时序中 时钟 RXC TXC 边沿与数据边沿 TXD RXD TX CTL RX CTL 的对齐 因此 FPGA想要正确收发数据 需要对TXC或RXC进行适当的延迟 由于最高时钟为12
  • 二手房交易差额款需要一次交清?

    在签订购房合同的时候 房东要求添加条款 在房产过户当日收取差额款 差额款应该一次性给他 还是可以按比例付 拿到房产证后付清 他给我写收条的时候 我应该注意什么 找法网小编为您详细介绍 网友咨询 我通过本地的老牌中介买房的 在签订购房合同的时
  • 时间序列数据特征提取TsFresh

    文章目录 1 源码和数据地址 2 TsFresh安装 3 代码部分说明 3 1 数据下载 3 2 从文件读取数据 4 特征拓展 4 1 默认参数 4 2 ComprehensiveFCParameters参数 4 3 EfficientFC
  • 电子工程师的自我修养 - OD输出

    开漏输出 Open Drain Output OD门 漏极开路 Open Drain 电路特点 利用外部电路的驱动能力 减少IC内部的驱动 可以将多个开漏输出的pin连接到一条线上 通过一个上拉电阻 在不增加任何器件的情况下 形成 线与 关
  • 使用myisamchK 命令修复数据

    使用myisamchk 命令修复表 myisam使用程序可以用来获得有关你的数据库表的统计信息 检查 修复 优化他们 命令格式 myisamchk option tables frm 常用的检查选项 information i 打印所检察标
  • 韦东山 IMX6ULL和正点原子_「正点原子NANO STM32开发板资料连载」第三章 MDK5 软件入门1...

    1 实验平台 ALIENTEK NANO STM32F411 V1开发板 2 摘自 正点原子STM32F4 开发指南 HAL 库版 关注官方微信号公众号 获取更多资料 正点原子 第三章 MDK5 软件入门 本章将向大家介绍 MDK5 软件和
  • Blazor组件自做四 : 使用JS隔离封装signature_pad签名组件

    运行截图 演示地址 响应式 感谢szimek写的棒棒的signature pad js项目 来源 https github com szimek signature pad 正式开始 1 在文件夹wwwroot lib 添加signatur
  • python3+requests+unittest实战系列【一】

    1 环境准备 python3 pycharm编辑器 2 框架目录展示 该套代码只是简单入门 有兴趣的可以不断后期完善 1 run py主运行文件 运行之后可以生成相应的测试报告 并以邮件形式发送 2 report文件夹存放测试结果报告 3
  • Python解偏微分方程

    2 u x
  • 能力强的项目经理是怎么催活儿的?(内附项目管理软件推荐)

    从确定做某个项目开始 项目经理就仿佛进入到了一个不断 催 的阶段 项目经理 催字符 恨不得贴到每个任务的负责人头上 仿佛项目经理除了开会就是催活儿 浪费大量精力和时间 今天分享的项目经理 催活儿指南 从计划 反馈以及隐形激励三个方面来梳理项
  • Linux 下的两个特殊的文件 -- /dev/null 和 /dev/zero 简介及对比

    1 概论 来自维基的解释 dev null 在类Unix系统中 dev null 或称空设备 是一个特殊的设备文件 它丢弃一切写入其中的数据 但报告写入操作成功 读取它则会立即得到一个EOF 在程序员行话 尤其是Unix行话中 dev nu
  • 链表类模板list

    描述 设计如下样式的链表类模板list 并对其进行简单使用 template