用模板写单链表

转载自:http://blog.csdn.net/itcastcpp/article/details/39081953

为了加深对模板的理解,我们今天一起用模板写一个单链表,希望通过这个例子,能够帮助大家加深对模板的体会,具体如下:

SList.hpp内容:

[cpp] view plain copy
  1. #ifndef _SLIST_H_  
  2. #define _SLIST_H_  
  3. #include <iostream>  
  4. using namespace std;  
  5. template<typename T>  
  6. struct Node  
  7. {  
  8.     T m_Data;  
  9.     Node<T> * m_pNext;  
  10.     Node()  
  11.     {  
  12.         m_pNext = NULL;  
  13.     }  
  14. };  
  15. template<typename T>  
  16. class CSList  
  17. {  
  18. public:  
  19.     CSList();  
  20.     ~CSList();  
  21.     //尾插法  
  22.     bool AppendNode(T Data);  
  23.     //删除  
  24.     bool DelNode(T Key);  
  25.     //修改  
  26.     bool ModNode(T Key, T New);  
  27.     //查找  
  28.     bool FindNode(T Key);  
  29.     //逆序  
  30.     bool Reverse();   
  31.     //打印  
  32.     void Print();  
  33.     //销毁  
  34.     void Clear();  
  35. private:  
  36.     Node<T> * m_pFirst;  
  37. };  
  38. template<typename T>  
  39. CSList<T>::CSList()  
  40. {  
  41.     m_pFirst = NULL;  
  42. }  
  43. template<typename T>  
  44. CSList<T>::~CSList()  
  45. {  
  46.     Node<T> * pCurNode = NULL;  
  47.     pCurNode = m_pFirst;  
  48.     while (pCurNode)  
  49.     {  
  50.         m_pFirst = m_pFirst->m_pNext;  
  51.         delete pCurNode;  
  52.         pCurNode = m_pFirst;  
  53.     }  
  54. }  
  55. //尾插法  
  56. template<typename T>  
  57. bool CSList<T>::AppendNode(T Data)  
  58. {  
  59.     Node<T> * pNewNode = new Node<T>;  
  60.     Node<T> * pCurNode = NULL;  
  61.     if (!pNewNode)  
  62.         return false;  
  63.     pNewNode->m_Data = Data;  
  64.     pNewNode->m_pNext = NULL;  
  65.     if (!m_pFirst)  
  66.     {  
  67.         m_pFirst = pNewNode;  
  68.         return true;  
  69.     }  
  70.     pCurNode = m_pFirst;  
  71.     while (pCurNode->m_pNext)  
  72.     {  
  73.         pCurNode = pCurNode->m_pNext;  
  74.     }  
  75.     pCurNode->m_pNext = pNewNode;  
  76.     return true;  
  77. }  
  78. //删除  
  79. template<typename T>  
  80. bool CSList<T>::DelNode(T Key)  
  81. {  
  82.     Node<T> * pPrevNode = NULL;  
  83.     Node<T> * pCurNode = NULL;  
  84.     if (!m_pFirst)  
  85.         return false;  
  86.     if (m_pFirst->m_Data == Key)  
  87.     {  
  88.         pCurNode = m_pFirst;  
  89.         m_pFirst = m_pFirst->m_pNext;  
  90.         delete pCurNode;  
  91.         pCurNode = NULL;  
  92.         return true;  
  93.     }  
  94.     pPrevNode = m_pFirst;  
  95.     pCurNode = m_pFirst->m_pNext;  
  96.     while (pCurNode->m_Data)  
  97.     {  
  98.         if (pCurNode->m_Data == Key)  
  99.         {  
  100.             pPrevNode->m_pNext = pCurNode->m_pNext;  
  101.             delete pCurNode;  
  102.             return true;  
  103.         }  
  104.         pPrevNode = pCurNode;  
  105.         pCurNode = pCurNode->m_pNext;  
  106.     }  
  107.     return false;  
  108. }  
  109. //修改  
  110. template<typename T>  
  111. bool CSList<T>::ModNode(T Key, T New)  
  112. {  
  113.     Node<T> * pCurNode = NULL;  
  114.     if (!m_pFirst)  
  115.         return false;  
  116.     pCurNode = m_pFirst;  
  117.     while (pCurNode)  
  118.     {  
  119.         if (pCurNode->m_Data == Key)  
  120.         {  
  121.             pCurNode->m_Data = New;  
  122.             return true;  
  123.         }  
  124.         pCurNode = pCurNode->m_pNext;  
  125.     }  
  126.     return false;  
  127. }  
  128. //查找  
  129. template<typename T>  
  130. bool CSList<T>::FindNode(T Key)  
  131. {  
  132.     Node<T> * pCurNode = NULL;  
  133.     if (!m_pFirst)  
  134.         return false;  
  135.     pCurNode = m_pFirst;  
  136.     while (pCurNode)  
  137.     {  
  138.         if (pCurNode->m_Data == Key)  
  139.             return true;  
  140.         pCurNode = pCurNode->m_pNext;  
  141.     }  
  142.     return false;  
  143. }  
  144. //逆序  
  145. template<typename T>  
  146. bool CSList<T>::Reverse()  
  147. {  
  148.     Node<T> * pPrevNode = NULL;  
  149.     Node<T> * pCurNode = m_pFirst;  
  150.     Node<T> * pNext = NULL;  
  151.     while (pCurNode)  
  152.     {  
  153.         pNext = pCurNode->m_pNext;  
  154.         pCurNode->m_pNext = pPrevNode;  
  155.         pPrevNode = pCurNode;  
  156.         pCurNode = pNext;         
  157.     }  
  158.     m_pFirst = pPrevNode;  
  159.     return true;  
  160. }  
  161.   
  162. template<typename T>  
  163. void CSList<T>::Print()  
  164. {  
  165.     Node<T> * pCurNode = m_pFirst;  
  166.     while (pCurNode)  
  167.     {  
  168.         cout << pCurNode->m_Data << "\t";  
  169.         pCurNode = pCurNode->m_pNext;  
  170.     }  
  171.     cout << endl;  
  172. }  
  173. template<typename T>  
  174. void CSList<T>::Clear()  
  175. {  
  176.     Node<T> * pCurNode = NULL;  
  177.     pCurNode = m_pFirst;  
  178.     while (pCurNode)  
  179.     {  
  180.         m_pFirst = m_pFirst->m_pNext;  
  181.         delete pCurNode;  
  182.         pCurNode = m_pFirst;  
  183.     }  
  184. }  
  185. #endif  
main.cpp的内容:

[cpp] view plain copy
  1. #define CRTDBG_MAP_ALLOC    
  2. #include <stdlib.h>    
  3. #include <crtdbg.h>    
  4. #include "SList.hpp"  
  5.   
  6. void main()  
  7. {  
  8.     CSList<int> IntList;  
  9.     IntList.AppendNode(1);  
  10.     IntList.AppendNode(7);  
  11.     IntList.AppendNode(4);  
  12.     IntList.AppendNode(2);  
  13.     IntList.AppendNode(8);  
  14.     IntList.AppendNode(5);  
  15.     IntList.AppendNode(9);  
  16.     IntList.AppendNode(6);  
  17.     IntList.AppendNode(3);  
  18.     IntList.Print();  
  19.     IntList.Reverse();  
  20.     IntList.Print();  
  21.     IntList.DelNode(3);  
  22.     IntList.DelNode(1);  
  23.     IntList.DelNode(2);  
  24.     IntList.Print();  
  25.     if (IntList.FindNode(6) == true)  
  26.     {  
  27.         cout << "find" << endl;  
  28.     }  
  29.     else  
  30.     {  
  31.         cout << "not find" << endl;  
  32.     }  
  33.     if (IntList.FindNode(7) == true)  
  34.     {  
  35.         cout << "find" << endl;  
  36.     }  
  37.     else  
  38.     {  
  39.         cout << "not find" << endl;  
  40.     }  
  41.     if (IntList.FindNode(5) == true)  
  42.     {  
  43.         cout << "find" << endl;  
  44.     }  
  45.     else  
  46.     {  
  47.         cout << "not find" << endl;  
  48.     }  
  49.     if (IntList.FindNode(100) == true)  
  50.     {  
  51.         cout << "find" << endl;  
  52.     }  
  53.     else  
  54.     {  
  55.         cout << "not find" << endl;  
  56.     }  
  57.     IntList.ModNode(6, 66);  
  58.     IntList.ModNode(7, 77);  
  59.     IntList.ModNode(5, 55);  
  60.     IntList.Print();  
  61.     IntList.Clear();  
  62.     _CrtDumpMemoryLeaks();  
  63.     system("pause");  
  64. }  
运行效果如图1所示:

图1 运行效果图

    从今天开始,我们以实践的方式,帮助大家加深对模板的理解。

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

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

相关文章

QT事件事件之一:Qt中的事件处理与传递

QT事件事件之一&#xff1a;Qt中的事件处理与传递前言一、简介二、QT中的事件三、事件的实现的方法前言 在QT中&#xff0c;事件是我们很常用的东西&#xff0c;以下是我用事件时总结和做法 一、简介 在QT中&#xff0c;事件作为一个对象&#xff0c;继承QEvent类&#xff0c…

linux下成功安装ffmpeg( 亲测有效 )

linux下成功安装ffmpeg&#xff08; 亲测有效 &#xff09;一、下载二、安装步骤1.安装yasm2.安装ffmpeg总结一、下载 ffmpeg 官网下载&#xff1a; http://ffmpeg.org/download.html 安装yasm 官网下载&#xff1a;http://yasm.tortall.net/Download.html 二、安装步骤 1.…

C++实现 简单 单链表

转自&#xff1a; http://blog.csdn.net/wonggonghong/article/details/21527577 我们首先建立一个<List.h>头文件&#xff0c;声明一个单链表结构&#xff1a; #include "List.h" [cpp] view plaincopy //创建一个单链表结构&#xff0c;包含一些常见的操作 …

ffmpeg音视频基础知识

ffmpeg音视频基础知识前言一、图像的基础知识二、视频编码基础知识1.视频和图片之间的关系2.为什么要编码&#xff1f;3.什么是编码&#xff1f;视频相关专业术语提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言…

Linux系统编程(一)

Linux系统编程&#xff08;一&#xff09;一、进程和程序二、内存布局内核空间用户空间三、进程状态四、环境变量五、进程共享一、进程和程序 程序&#xff1a;是指编译好的二进制文件&#xff0c;存储在磁盘中&#xff0c;不占用系统资源。 进程&#xff1a;是系统进行资源分…

Linux的SOCKET编程 简单演示

转载&#xff1a;http://blog.csdn.net/hguisu/article/details/7445768/ Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行&#xff0c;为保证两个相互通信的进 程之间既互不干扰又协调一致工作&a…

Unity(一)必然事件

【MonoBehaviour 类】&#xff08;一&#xff09;必然事件一、必然事件是什么&#xff1f;二、常用函数执行顺序1.Awake2.Start3.update4.FixedUpdate三、Awake和start区别一、必然事件是什么&#xff1f; 在Unity中必然事件也称脚本生命周期&#xff0c;是指在Unity脚本在唤醒…

Linux系统编程(二)孤儿进程和僵尸进程

Linux系统编程&#xff08;二&#xff09;一、exec函数族1.exec函数二、孤儿进程和僵尸进程三、wait和waitpid1.wait函数2.waitpid函数一、exec函数族 exec函数使用时&#xff0c;改程序的用户空间的代码和数据会被新程序给替代&#xff0c;会从新程序的启动例程开始。调用exe…

linux下c/c++实例之十socket简单应用

转自&#xff1a;http://blog.csdn.net/taiyang1987912/article/details/49738351 一、简介 通过socket扫描本机打开的tcp端口号&#xff0c;模拟用户名、密码登录服务器的过程、socket文件传输及模仿http服务器。 二、详解 1、Linux下tcp端口扫描 &#xff08;1&#xff09;…

Linux系统编程(三)进程间的通信

Linux系统编程&#xff08;三&#xff09;进程间的通信一、为什么需要进程之间的通信&#xff08;IPC&#xff09;&#xff1f;二、管道1.概念2.特质3.原理4.局限性5.代码2.读入数据三、共享存储映射注意事项父子进程通信一、为什么需要进程之间的通信&#xff08;IPC&#xff…

exec 函数族

转自&#xff1a;http://www.cnblogs.com/mickole/p/3187409.html linux系统编程之进程&#xff08;五&#xff09;&#xff1a;exec系列函数&#xff08;execl,execlp,execle,execv,execvp)使用 本节目标&#xff1a; exec替换进程映像exec关联函数组&#xff08;execl、execl…

Linux系统编程(四)信号

Linux系统编程&#xff08;四&#xff09;信号一、什么是信号&#xff1f;1、信号的本质2、信号来源硬件来源软件来源二、常见信号1.可靠信号和不可靠信号2、不可靠信号主要有以下问题:3、可靠信号与不可靠信号注册机制三、信号处理方式四、信号处理过程五、未决信号和阻塞信号…

SIGCHLD信号回收子进程

SIGCHLD信号回收子进程代码问题注意点代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> #include <signal.h>void handler(int signo) {int status; pid_t pid;while ((pid waitpid(0, &status…

Wait waitpid

转自&#xff1a;http://www.cnblogs.com/mickole/p/3187770.html linux系统编程之进程&#xff08;六&#xff09;&#xff1a;父进程查询子进程的退出,wait,waitpid 本节目标&#xff1a; 僵进程SIGCHLDwaitwaitpid 一&#xff0c;僵尸进程 当一个子进程先于父进程结束运行时…

Linux C++ 简单爬虫

转载&#xff1a;http://blog.csdn.net/orthocenterchocolate/article/details/38665937 方便易用&#xff0c;传入URL&#xff0c;返回对应页面的内容 [cpp] view plaincopy #include <iostream> #include <string> #include <netdb.h> #include <…

Linux系统编程(七)消息队列

Linux系统编程&#xff08;七&#xff09;消息队列一、什么是消息队列二、消息队列内部原理三、实现消息队列的收发1.发送消息队列2.接收消息队列四、消息队列与命名管道的比较一、什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。每个数据块都…

基于Linux的SOCKET编程之TCP半双工Client-Server聊天程序

转自&#xff1a;http://blog.csdn.net/apollon_krj/article/details/53398448#0-tsina-1-64987-397232819ff9a47a7b7e80a40613cfe1 所谓半双工通信&#xff0c;即通信双方都可以实现接发数据&#xff0c;但是有一个限制&#xff1a;只能一方发一方收&#xff0c;之后交换收发对…

智能算法(GA、DBO等)求解阻塞流水车间调度问题(BFSP)

先做一个声明&#xff1a;文章是由我的个人公众号中的推送直接复制粘贴而来&#xff0c;因此对智能优化算法感兴趣的朋友&#xff0c;可关注我的个人公众号&#xff1a;启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法&#xff0c;经典的&#xff0c;或者是近几年…

Linux socket编程,对套接字进行封装

转自&#xff1a;http://www.cnblogs.com/-Lei/archive/2012/09/04/2670942.html 下面是对socket操作的封装&#xff0c;因为在Linux下写中文到了windows里面会乱码&#xff0c;所以注释用英文来写&#xff0c;有空再查下解决方法吧 socket.h #ifndef SOCKET_H #define SOCKET_…

Linux系统编程(九)线程同步

Linux系统编程&#xff08;九&#xff09;线程同步一、什么是线程同步&#xff1f;二、互斥量三、条件变量pthread_cond_wait函数pthread_cond_signal函数生产者和消费者模型一、什么是线程同步&#xff1f; 线程同步&#xff0c;指一个线程发出某一功能调用时&#xff0c;在没…