当前位置:   article > 正文

C++进阶学习——单向链表的实现_set next c++

set next c++

示例代码如下:

  1. #include <iostream>
  2. using namespace std;
  3. class Node //节点类
  4. {
  5. public:
  6. //普通构造函数:无参数,带1个参数,带2个参数
  7. Node(){}
  8. Node(int n){ num = n; next = NULL; }
  9. Node(int n, Node *p){ num = n; next = p; }
  10. void setNum(int n = 0) { num = n; }
  11. int getNum() const { return num; }
  12. void setNext(Node *p = NULL){ next = p; } //设置指针域
  13. Node *getNext() const { return next; }//获取指针域
  14. private:
  15. int num; //数据域
  16. Node *next; //指针域
  17. };
  18. class Linklist //链表类
  19. {
  20. public:
  21. //构造函数和析构函数
  22. Linklist(){ head = NULL; }
  23. Linklist(int n){ head = new Node(n); }
  24. ~Linklist() { clear(); }
  25. void addAtEnd(int n);//往链表尾添加节点
  26. void addAtHead(int n);//往链表头添加节点
  27. void addByNum(int n);//升序插入节点
  28. void visitAllNode() const;//遍历所有的节点
  29. Node *searchByNum(int n) const; //查找值为num的节点
  30. void deleteByNum(int n);//删除值为n的节点
  31. void clear();//删除链表所有节点
  32. private:
  33. Node *head;
  34. };
  35. //往链表尾添加节点
  36. void Linklist::addAtEnd(int n)
  37. {
  38. if(NULL == head)
  39. {
  40. head = new Node(n);
  41. }
  42. else
  43. {
  44. Node *temp=head;
  45. while( temp->getNext() != NULL)
  46. {
  47. temp = temp->getNext(); //用temp来指向下一个节点
  48. }
  49. //执行到这时,说明temp是最后一个节点,temp的下一个节点为NULL
  50. temp->setNext( new Node(n) );//插入节点
  51. }
  52. }
  53. //往链表头添加节点
  54. void Linklist::addAtHead(int n)
  55. {
  56. if(NULL == head)
  57. {
  58. head = new Node(n);
  59. }
  60. else
  61. {
  62. Node *temp = new Node(n);//待插入的节点
  63. temp->setNext(head);//temp的下一个节点执行头
  64. head = temp; //新节点当做头结点
  65. }
  66. }
  67. //升序插入节点
  68. void Linklist::addByNum(int n)
  69. {
  70. if(NULL == head)//头结点为NULL
  71. {
  72. head = new Node(n);
  73. }
  74. else
  75. {
  76. Node *pf, *pb; //pf前一个结点, pb为后一个节点
  77. pf = pb = head;
  78. while(NULL != pb)
  79. {
  80. if(pb->getNum() >= n)//>=升序,<降序
  81. {
  82. break;
  83. }
  84. pf = pb; //pf保存当前节点
  85. pb = pb->getNext(); //pb指向下一个节点
  86. }
  87. if(NULL == pb)//尾结点
  88. {
  89. pf->setNext( new Node(n) );//插入节点
  90. }
  91. else
  92. {
  93. Node *temp = new Node(n);//待插入的节点
  94. if(pb == head) //头节点
  95. {
  96. temp->setNext(head);//temp的下一个节点执行头
  97. head = temp; //新节点当做头结点
  98. }
  99. else //中间
  100. {
  101. pf->setNext(temp);
  102. temp->setNext(pb);
  103. }
  104. }
  105. }
  106. }
  107. //遍历所有的节点
  108. void Linklist::visitAllNode() const
  109. {
  110. if(NULL == head)
  111. {
  112. cout<<"空链表!"<<endl;
  113. }
  114. else
  115. {
  116. Node *temp=head;
  117. while( temp != NULL)
  118. {
  119. cout<< temp->getNum()<<" --> ";
  120. temp=temp->getNext();
  121. }
  122. cout << "NULL" << endl;
  123. }
  124. }
  125. //查找值为num的节点
  126. Node * Linklist::searchByNum(int n) const
  127. {
  128. Node *temp = head;
  129. while(temp != NULL)
  130. {
  131. if(temp->getNum() == n)
  132. {
  133. return temp;
  134. }
  135. temp = temp->getNext();
  136. }
  137. return NULL;
  138. }
  139. //删除节点
  140. void Linklist::deleteByNum(int n)
  141. {
  142. Node *pf, *pb;
  143. pf = pb = head;
  144. while(NULL != pb)
  145. {
  146. if(pb->getNum() == n)
  147. {
  148. break;
  149. }
  150. pf = pb;
  151. pb = pb->getNext();
  152. }
  153. if(NULL == pb)
  154. {
  155. cout << n << ":此值不存在" << endl;
  156. }
  157. else
  158. {
  159. //头结点
  160. if(pb == head)
  161. {
  162. pf = head->getNext();
  163. delete head;
  164. head = pf;
  165. }
  166. else
  167. {
  168. pf->setNext( pb->getNext() );
  169. delete pb;
  170. }
  171. }
  172. }
  173. //删除链表所有节点
  174. void Linklist::clear()
  175. {
  176. Node *temp = NULL;
  177. temp = head; //用一个临时节点保存头结点
  178. //遍历链表,每次先保存头结点的next结点,然后删除头结点
  179. while (NULL != temp)
  180. {
  181. temp = head->getNext();//先保存头结点的next结点
  182. delete head;//删除头结点
  183. head = temp;//之前头结点的next节点重新作为head
  184. }
  185. cout << "链表已经清空\n";
  186. }
  187. int main()
  188. {
  189. Linklist myList(1); //创建链表对象
  190. myList.visitAllNode(); //遍历所有的节点
  191. cout << endl;
  192. myList.addAtEnd(2); //尾部插入
  193. myList.addAtHead(0);//头部插入
  194. myList.visitAllNode(); //遍历所有的节点
  195. cout << endl;
  196. for(int i = 3; i < 10; i++)
  197. {
  198. myList.addByNum(i); //升序插入节点
  199. }
  200. myList.visitAllNode(); //遍历所有的节点
  201. cout << endl;
  202. Node *temp = myList.searchByNum(5); //查找值为5的节点
  203. if(NULL != temp)
  204. {
  205. cout << "此节点的值为:" << temp->getNum() << endl;
  206. }
  207. else
  208. {
  209. cout << "值为5的节点不存在" << endl;
  210. }
  211. temp = myList.searchByNum(100); //查找值为100的节点
  212. if(NULL != temp)
  213. {
  214. cout << "此节点的值为:" << temp->getNum() << endl;
  215. }
  216. else
  217. {
  218. cout << "值为100的节点不存在" << endl;
  219. }
  220. cout << endl;
  221. myList.deleteByNum(5);//删除值为5的节点
  222. cout << "删除值为5的节点:";
  223. myList.visitAllNode(); //遍历所有的节点
  224. cout << endl;
  225. myList.deleteByNum(100);//删除值为100的节点
  226. cout << endl;
  227. return 0;
  228. }

编译运行结果如下:



本教程示例代码下载请点此链接:http://download.csdn.net/detail/tennysonsky

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/858791
推荐阅读
相关标签
  

闽ICP备14008679号