用模板写单链表 尹成

转载: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/384288.shtml

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

相关文章

lseek、stat、access、chmod、strtol、truncate、unlink

lseek&#xff0c;可实现计算文件长度&#xff0c;以及文件扩展。 int ret lseek(fd, 0, SEEK_END); //文件长度printf("file lendth %d\n", ret); int ret lseek(fd, 2000, SEEK_END); //文件拓展2000个byte 在文件末尾偏移2000printf("return va…

inode浅谈

索引节点inode&#xff1a;保存的其实是实际的数据的一些信息&#xff0c;这些信息称为“元数据”(也就是对文件属性的描述)。例如&#xff1a;文件大小&#xff0c;设备标识符&#xff0c;用户标识符&#xff0c;用户组标识符&#xff0c;文件模式&#xff0c;扩展属性&#x…

Openssl-MD5

http://blog.csdn.net/sunspider107/article/details/7395904 MD5是最常用的一个信息摘要算法&#xff0c;虽然现在慢慢被SHA1算法替代&#xff0c;但还是应用广泛。 MD5的计算结果是16个字节。 int MD5_Init(MD5_CTX *c); 初始化MD5 Context参数&#xff1b; c: MD5 context; …

opendir、readdir以及使用

opendir&#xff0c;打开一个目录。 函数原型&#xff1a;DIR *opendir(const char *name) DIR *fopendir(int fd) DIR是一个结构指针&#xff0c;是一个内部结构&#xff0c;保存所打开的目录信息。函数出错返回NULL readdir&#xff0c;读目录 ,<dirent.h> 函数原型&am…

Linux下C语言使用openssl库进行MD5校验

http://blog.csdn.net/cassie_huang/article/details/53212933 作者&#xff1a;无脑仔的小明 出处&#xff1a;http://www.cnblogs.com/wunaozai/ 我们以一个字符串为例&#xff0c;新建一个文件filename.txt&#xff0c;在文件内写入hello &#xff0c;然后在Linux下可以使…

dup、dup2、fcntl

dup、dup2&#xff0c;复制文件描述符 int dup(int oldfd);  //返回文件描述表中没有被占用的最小可用的描述符&#xff0c;新旧描述符作用相同 int dup2(int oldfd, int newfd);  //如果new已经被打开&#xff0c;先关闭再拷贝就会指向同一个文件&#xff0c;如果old和new…

进程

创建子进程&#xff1a;fork调用&#xff0c; 一次fork调用返回两个值&#xff0c;1、返回子进程的pid&#xff08;非负整数&#xff09; 2、返回0 父进程的fork返回子进程的id&#xff0c;子进程的fork返回0&#xff08;表示执行成功&#xff09; 创建单个子进程&#xff1a; …

Ubuntu在vmware虚拟机无法上网的解决方法

http://blog.csdn.net/xueyushenzhou/article/details/50460183 在vmware中安装Ubuntu之后&#xff0c;我们希望基本的功能如上网、传输文件等功能都是可用的&#xff0c;但是经常遇到不能上网的情况。使用笔记本时&#xff0c;我们经常希望能通过无线网卡上网&#xff0c;但是…

exec函数族

fork创建子进程后执行的是和父进程相同的程序&#xff08;但有可能执行不同的代码分支&#xff09;&#xff0c;子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时&#xff0c;该进程的用户空间代码和数据完全被新程序替换&#xff0c;从新程序的启动例…

IO 多路复用之poll总结

http://www.cnblogs.com/Anker/p/3261006.html IO多路复用之poll总结 1、基本知识 poll的机制与select类似&#xff0c;与select在本质上没有多大差别&#xff0c;管理多个描述符也是进行轮询&#xff0c;根据描述符的状态进行处理&#xff0c;但是poll没有最大文件描述符数量的…

wait、waitpid

父进程调用wait函数可以回收子进程的终止信息&#xff0c;该函数有三个功能&#xff1a;&#xff08;一次wait调用回收一个子进程 回收多个用循环&#xff09; 1、阻塞等待子进程退出 2、回收子进程残留资源 3、获取子进程结束状态&#xff08;退出原因&#xff09; pid_t wait…

C++项目中的extern C {}

http://www.cnblogs.com/skynet/archive/2010/07/10/1774964.html 引言 在用C的项目源码中&#xff0c;经常会不可避免的会看到下面的代码&#xff1a; 123456789#ifdef __cplusplusextern "C" {#endif/*...*/#ifdef __cplusplus}#endif它到底有什么用呢&#xff0c;…

管道

管道&#xff0c;其本质是一个伪文件&#xff08;实为内核缓冲区&#xff09;&#xff1b;由两个文件描述符引用&#xff0c;一个表示读端、一个表示写端&#xff1b;规定数据从管道的写端流入&#xff0c;读端流出。 管道的原理&#xff1a;管道实为内核使用环形队列机制&…

C/S、B/S的区别

C/S结构&#xff0c;即Client/Server(客户机/服务器)结构&#xff0c;是大家熟知的软件系统体系结构&#xff0c;通过将任务合理分配到Client端和Server端&#xff0c;降低了系统的通讯开销&#xff0c;可以充分利用两端硬件环境的优势。早期的软件系统多以此作为首选设计标准。…

extern c用法解析

http://www.jianshu.com/p/5d2eeeb93590 引言C保留了一部分过程式语言的特点&#xff0c;因而它可以定义不属于任何类的全局变量和函数。但是&#xff0c;C毕竟是一种面向对象的程序设计语言&#xff0c;为了支持函数的重载&#xff0c;C对全局函数的处理方式与C有明显的不同。…

C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)

http://blog.csdn.net/xiaofeige567/article/details/27484137 C语言实现单链表&#xff08;带头结点&#xff09;的基本操作&#xff08;创建&#xff0c;头插法&#xff0c;尾插法&#xff0c;删除结点&#xff0c;打印链表&#xff09; [plain] view plaincopy #include<…

静态网页与动态网页区别

一、静态web页面&#xff1a;1、在静态Web程序中&#xff0c;客户端使用Web浏览器&#xff08;IE、FireFox等&#xff09;经过网络(Network)连接到服务器上&#xff0c;使用HTTP协议发起一个请求&#xff08;Request&#xff09;&#xff0c;告诉服务器我现在需要得到哪个页面&…

单向循环链表C语言实现

http://blog.csdn.net/morixinguan/article/details/51771633 我们都知道&#xff0c;单向链表最后指向为NULL&#xff0c;也就是为空&#xff0c;那单向循环链表就是不指向为NULL了&#xff0c;指向头节点&#xff0c;所以下面这个程序运行结果就是&#xff0c;你将会看到遍历…

web服务器原理

什么是web服务器&#xff1f; 在Mosaic浏览器&#xff08;通常被认为是第一个图形化的web浏览器&#xff09;和超链接内容的初期&#xff0c;演变出了“web服务器”的新概念&#xff0c;它通过HTTP协议来提供静态页面内容和图片服务。在那个时候&#xff0c;大多数内容都是静态…

(C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作

http://blog.csdn.net/fisherwan/article/details/19760681 上午写了下单向循环链表的程序&#xff0c;今天下午我把双向链表的程序写完了。其实双向链表和单向链表也是有很多相似的地方的&#xff0c;听名字可以猜到&#xff0c;每个节点都包含两个指针&#xff0c;一个指针指…