转载: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. template<typename T>
  162. void CSList<T>::Print()
  163. {
  164. Node<T> * pCurNode = m_pFirst;
  165. while (pCurNode)
  166. {
  167. cout << pCurNode->m_Data << "\t";
  168. pCurNode = pCurNode->m_pNext;
  169. }
  170. cout << endl;
  171. }
  172. template<typename T>
  173. void CSList<T>::Clear()
  174. {
  175. Node<T> * pCurNode = NULL;
  176. pCurNode = m_pFirst;
  177. while (pCurNode)
  178. {
  179. m_pFirst = m_pFirst->m_pNext;
  180. delete pCurNode;
  181. pCurNode = m_pFirst;
  182. }
  183. }
  184. #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. void main()
  6. {
  7. CSList<int> IntList;
  8. IntList.AppendNode(1);
  9. IntList.AppendNode(7);
  10. IntList.AppendNode(4);
  11. IntList.AppendNode(2);
  12. IntList.AppendNode(8);
  13. IntList.AppendNode(5);
  14. IntList.AppendNode(9);
  15. IntList.AppendNode(6);
  16. IntList.AppendNode(3);
  17. IntList.Print();
  18. IntList.Reverse();
  19. IntList.Print();
  20. IntList.DelNode(3);
  21. IntList.DelNode(1);
  22. IntList.DelNode(2);
  23. IntList.Print();
  24. if (IntList.FindNode(6) == true)
  25. {
  26. cout << "find" << endl;
  27. }
  28. else
  29. {
  30. cout << "not find" << endl;
  31. }
  32. if (IntList.FindNode(7) == true)
  33. {
  34. cout << "find" << endl;
  35. }
  36. else
  37. {
  38. cout << "not find" << endl;
  39. }
  40. if (IntList.FindNode(5) == true)
  41. {
  42. cout << "find" << endl;
  43. }
  44. else
  45. {
  46. cout << "not find" << endl;
  47. }
  48. if (IntList.FindNode(100) == true)
  49. {
  50. cout << "find" << endl;
  51. }
  52. else
  53. {
  54. cout << "not find" << endl;
  55. }
  56. IntList.ModNode(6, 66);
  57. IntList.ModNode(7, 77);
  58. IntList.ModNode(5, 55);
  59. IntList.Print();
  60. IntList.Clear();
  61. _CrtDumpMemoryLeaks();
  62. system("pause");
  63. }

运行效果如图1所示:

图1 运行效果图

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

用模板写单链表 尹成相关推荐

  1. 手写识别底层原理_LinkedList底层原理和手写单链表

    2.1 单链表技能点 · 认识单链表 o 特点 数据元素的存储对应的是不连续的存储空间,每个存储结点对应一个需要存储的数据元素. 每个结点是由数据域和指针域组成. 元素之间的逻辑关系通过存储节点之间的 ...

  2. c语言用单链表实现lru算法,手写单链表实现和LRU算法模拟

    手写单链表,实现增删改查 package top.zcwfeng.java.arithmetic.lru; //单链表 public class LinkedList { Node list; int ...

  3. 再写单链表(不带头单链表)

    单链表 实际中链表的结构非常多样,以下情况组合起来就有8种链表结构: 单向.双向 带头.不带头 循环.非循环 虽然有这么多的链表的结构,但是我们实际中最常用还是两种结构: 无头单向非循环链表:结构简单 ...

  4. java面试手写单链表_(转)面试大总结之一:Java搞定面试中的链表题目

    packageLinkedListSummary; importjava.util.HashMap; importjava.util.Stack; /** * http://blog.csdn.net ...

  5. 如何用java写单链表_如何使用Java实现单链表?

    首先构建节点类: package com.fzw.sf; public class Node { private Object data; private Node next; Node(Object ...

  6. c语言单链表设计报告,单链表实验报告

    <数据结构>实验报告二 分校: 学号: 日期: 班级: 姓名: 程序名: L2311.CPP 一.上机实验的问题和要求: 单链表的查找.插入与删除.设计算法,实现线性结构上的单链表的产生以 ...

  7. DHU数据结构-单链表-ADT应用-长整数加法运算(使用单链表存储计算结果)

    目录 1.题目 2.题解 3.代码实现 1.题目 单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果) 作者: 冯向阳 时间限制: 1S 章节: DS:线性表 问题描述 : 目的:使 ...

  8. C语言版--单链表排序,冒泡排序,选择排序,插入排序,快速排序,应有尽有,保证看懂,没有bug!交换节点版本!

    一.废话不多说,直接上代码.如果想看双向循环链表的朋友,可以在我的博客里找. 你好 #include <stdio.h> #include <stdlib.h>typedef ...

  9. 数据结构之单链表的增删查改等操作画图详解

    单链表 文章目录 单链表 链表的概念及其结构 概念 结构 链表的实现 开辟一个新结点 链表的销毁 打印链表 单链表的尾插 单链表的头插 单链表的头删 单链表的尾删 找到单链表中的一个结点 在pos位置 ...

最新文章

  1. 14 个 Spring MVC 顶级技巧,随时用随时爽,一直用一直爽
  2. 基于Gitolite的Git服务架设
  3. opencv 运动检测
  4. 金蝶BOS社区版Beta1 下载
  5. JVM内存模型知识点总结
  6. 用Python实现选择排序
  7. 2/7 SELECT语句:排序(ORDER BY)
  8. [深度学习-数据集] cifar-10数据集介绍
  9. 使用spyder编译器单步调试python
  10. pythonmatplotlib怎么设置曲线_python – Matplotlib的“symlog”选项:如何防止曲线“回来”?...
  11. 前端开发教程:使用 CSS3 Transforms 构建圆形导航
  12. ubuntu gedit 工具菜单下没有 Manage external tools
  13. 新兴IT企业特斯拉(七)——充电先行
  14. mysql 5.7 binlog 压缩_MySQL binlog 压缩功能的相关介绍-爱可生
  15. KindEditor富文本编辑从数据库取出来内容回显在页面上会自动增加行间距以及回车换行会自动间距变大的问题...
  16. 计算机串口通信的作用,串口通信的具体用途是什么
  17. github免费空间玩法
  18. 域名解析、域名转向的作用
  19. UI设计中异常状态设计总结
  20. 语音助手(基于v3s开源啦)

热门文章

  1. 增加 jQueryValidate的手机号验证功能
  2. Manacher's Algorithm 马拉车算法(最长回文串)
  3. Java开发人员的升级之路
  4. AndEngine引擎之SmoothCamera 平滑摄像机
  5. Oracle 查询历史数据(转帖)
  6. 今天开始学C#.NET
  7. java excel处理框架,Java三方—-excel框架之POI的使用一
  8. java没有打印mysql日志_0216 aop和打印数据库执行日志
  9. python众数问题给定含有n个元素的多重集合s_分治法求众数 给定含有n个元素的多重集合S 联合开发网 - pudn.com...
  10. java三板斧_Java 枚举使用三板斧