原理可访问https://www.cnblogs.com/yang901112/p/11674333.html

头文件

  1. #ifndef RLIST_H
  2. #define RLIST_H
  3. #include <iostream>
  4.  
  5. template <class T> class List;
  6.  
  7. template <class T>
  8. class ListNode
  9. {
  10. friend class List<T>;
  11. public:
  12. ListNode() { next = ; }
  13. ListNode(T el, ListNode* ptr = ) {
  14. data = el; next = ptr;
  15. }
  16. private:
  17. T data;
  18. ListNode *next;
  19. };
  20.  
  21. template <class T>
  22. class List
  23. {
  24. public:
  25. List() {
  26. head = ;
  27. head = tail = ; }
  28. ~List();
  29. int isEmpty() {
  30. return head == ;
  31. }
  32. void addToHead(T); //从头插入结点
  33. void addToTail(T); //从尾部插入节点
  34. void disPlay() const;
  35. T deleteFromHead(); //从头删除结点//若不需要返回值可以使用void
  36. T deleteFromTail(); //从尾部删除节点
  37. void deleteNode(T); //按值删除结点
  38. bool isInList(T) const; //判断值是否在链表里
  39. void Invert(); //反转链表
  40. private:
  41. ListNode<T> *head, *tail;
  42. };
  43.  
  44. template <class T>
  45. List<T>::~List() {
  46. for (ListNode<T> *p; !isEmpty();) {
  47. p = head->next;
  48. delete head;
  49. head = p;
  50. }
  51. }
  52.  
  53. template <class T>
  54. void List<T>::addToHead(T el) {
  55. head = new ListNode<T>(el, head);
  56. if (tail == )
  57. tail = head;
  58. }
  59.  
  60. template <class T>
  61. void List<T>::addToTail(T el) {
  62. if (tail != ) {
  63. tail->next = new ListNode<T>(el);
  64. tail = tail->next;
  65. }
  66. else head = tail = new ListNode<T>(el);
  67. }
  68.  
  69. template <class T>
  70. T List<T>::deleteFromHead() {
  71. T el = head->data;
  72. ListNode<T> *tmp = head;
  73. if(head==tail)
  74. {
  75. head = tail = ;
  76. }
  77. else head = head->next;
  78. delete tmp;
  79. return el;
  80. }
  81.  
  82. template <class T>
  83. T List<T>::deleteFromTail() {
  84. T el = tail->data;
  85. if(head==tail)
  86. {
  87. delete head;
  88. head = tail = ;
  89. }
  90. else {
  91. ListNode<T> *tmp;
  92. for (tmp = head; tmp->next != tail; tmp = tmp->next);
  93. delete tail;
  94. tail = tmp;
  95. tail->next = ;
  96. }
  97. return el;
  98. }
  99.  
  100. template <class T>
  101. void List<T>::deleteNode(T el) {
  102. ListNode<T> *previous = ;
  103. ListNode<T> *current;
  104. for (current = head; current && current->data != el;
  105. previous = current, current = current->next);
  106. if (current)
  107. {
  108. if (previous) { previous->next = current->next; }
  109. else head = head->next;
  110. delete current;
  111. }
  112. }
  113.  
  114. /*****************************************/
  115. //template <class T>
  116. //bool List<T>::isInList(T el) const {
  117. // bool flag = false;
  118. // ListNode<T> *tmp;
  119. // tmp = head->next;
  120. // while (tmp) {
  121. // if (tmp->data == el) {
  122. // flag = true;
  123. // break;
  124. // }
  125. // tmp = tmp->next;
  126. // }
  127. // return flag;
  128. //}
  129.  
  130. //可以使用for循环代替while代码可以简洁一些
  131. template <class T>
  132. bool List<T>::isInList(T el) const {
  133. ListNode<T> *tmp;
  134. for (tmp = head; tmp && tmp->data != el; tmp = tmp->next);
  135. return tmp != ;
  136. }
  137. /*****************************************/
  138.  
  139. template <class T>
  140. void List<T>::Invert() {
  141. ListNode<T> *p = head, *q = ;
  142. while (p)
  143. {
  144. ListNode<T> *r = q; q = p;
  145. p = p->next;
  146. q->next = r;
  147. }
  148. head = q;
  149. }
  150.  
  151. template <class T>
  152. void List<T>::disPlay() const{
  153. //ListNode<T> *p;
  154. //p = head;
  155. //while (p)
  156. //{
  157. // std::cout << p->data;
  158. // if (p->next) { std::cout << "->"; } //就是仅在数字之间加"->"
  159. // p = p->next;
  160. //}
  161. for (ListNode<T> *current = head; current; current = current->next)
  162. {
  163. std::cout << current->data;
  164. if (current->next) std::cout << "->";
  165. }
  166. std::cout << std::endl;
  167. }
  168.  
  169. #endif

源文件

  1. #include <iostream>
  2. #include"Rlist.h"
  3. #include <iomanip>
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8. cout << "测试" << endl;
  9. List<int> ilist;
  10. ilist.addToTail();
  11. ilist.addToTail();
  12. ilist.addToTail();
  13. ilist.addToTail();
  14. ilist.disPlay();
  15. ilist.deleteFromHead();
  16. ilist.disPlay();
  17.  
  18. List<int> ilist2;
  19. ilist2.addToHead();
  20. ilist2.addToHead();
  21. ilist2.addToHead();
  22. ilist2.addToHead();
  23. ilist2.disPlay();
  24. cout << ilist2.isInList() << endl;
  25. ilist2.deleteFromTail();
  26. ilist2.disPlay();
  27. cout << ilist2.isInList() << endl;
  28.  
  29. List<char> charlist1;
  30. charlist1.addToTail('a');
  31. charlist1.addToTail('b');
  32. charlist1.addToTail('c');
  33. charlist1.addToTail('d');
  34. charlist1.disPlay();
  35. charlist1.Invert();
  36. charlist1.disPlay();
  37. charlist1.deleteNode('c');
  38. charlist1.disPlay();
  39. charlist1.deleteNode('e'); //虽然'e'不存在,但是不影响
  40. charlist1.disPlay();
  41.  
  42. return ;
  43. }

数据结构-单链表-类定义C++的更多相关文章

  1. 数据结构-单链表-类定义2-C++

    上一次的C++链表实现两个单链表的连接不太理想,此次听了一些视频课,自己补了个尾插法,很好的实现了两个链表的连接,当然了,我也是刚接触,可能是C++的一些语法还不太清楚,不过硬是花了一些时间尽量在数据 ...

  2. C# 数据结构--单链表

    什么是单链表 这两天看到很多有关单链表的面试题,对单链表都不知道是啥的我.经过学习和整理来分享一下啥是单链表和单链表的一些基本使用方法.最后看些网上有关单链表的面试题代码实例. 啥是单链表? 单链表是 ...

  3. python算法与数据结构-单链表(38)

    一.链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括 ...

  4. python实现数据结构单链表

    #python实现数据结构单链表 # -*- coding: utf-8 -*- class Node(object): """节点""" ...

  5. C语言数据结构-单链表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作

    1.数据结构-单链表的实现-C语言 typedef struct LNode { int data; struct LNode* next; } LNode,*LinkList; //这两者等价.Li ...

  6. 数据结构——单链表java简易实现

    巩固数据结构 单链表java实现 单链表除了表尾 每个几点都有一个后继 结点有数据和后继指针组成  通过构建表头和表尾(尾部追加需要)两个特殊几点 实现单链表的一些操作,代码如下 package co ...

  7. 数据结构 - 单链表 C++ 实现

    单链表 单链表的定义 typedef int ElemType; typedef struct LNode { ElemType data; LNode *next; } LNode, *LinkLi ...

  8. 数据结构—单链表(类C语言描写叙述)

    单链表 1.链接存储方法 链接方式存储的线性表简称为链表(Linked List). 链表的详细存储表示为: ① 用一组随意的存储单元来存放线性表的结点(这组存储单元既能够是连续的.也能够是不连续的) ...

  9. 数据结构实验2:C++实现单链表类

    太简单了,直接贴题目然后上代码. 题目: 实验2 2.1 实验目的 熟练掌握线性表的链式存储结构. 熟练掌握单链表的有关算法设计. 根据具体问题的需要,设计出合理的表示数据的链式存储结构,并设计相关算 ...

随机推荐

  1. 查看 ssh 攻击 和 攻击成功者

    查看攻击失败记录: grep "Failed password for invalid user admin" /var/log/auth.log 查看攻击成功的记录: grep ...

  2. c++ 模拟java的反射,根据类名动态创建类

    参考: https://blog.csdn.net/jnu_simba/article/details/9318799 原先有静态变量依赖问题, https://blog.csdn.net/anony ...

  3. Acer笔记本如何装系统?

    一.准备工作 1.一个有win7或者XP系统的电脑(制作启动盘用) 2.一个8G以上的U盘 3.win7&win8系统包(win8.1下载地址:http://pan.baidu.com/s/1 ...

  4. Java性能分析神器-JProfiler详解(转)

    前段时间在给公司项目做性能分析,从简单的分析Log(GC log, postgrep log, hibernate statitistic),到通过AOP搜集软件运行数据,再到PET测试,感觉时间花了 ...

  5. openresty开发系列16--lua中的控制结构if-else/repeat/for/while

    openresty开发系列16--lua中的控制结构if-else/repeat/for/while 一)条件 - 控制结构 if-else if-else 是我们熟知的一种控制结构.Lua 跟其他语 ...

  6. Django ORM的继承关系

    ORM中通常将对象引用映射到外键,但是对于继承,关系数据库中没有自然有效的方法来对应.从数据存储的角度来看,在映射继承关系时,可以采用几种方式(参考JPA中的InheritanceType.定义): ...

  7. 软件定义网络基础---SDN的核心思想

    一:SDN包含的核心思想:解耦,抽象,可编程 二:解耦 (一)SDN网络解耦思想 解耦是指将控制平面和数据平面进行分离,主要为了解决传统网络中控制平面和数据平面在物理上紧耦合导致的问题 控制平面和数据 ...

  8. DEBUG技巧1 SE37将参数保存为测试数据

    1. SE37调试函数的时候,将参数保存为测试数据,供下次调试使用, 或者参考标准的赋值进行赋值 2. SE37 ->执行-> 测试序列 测试函数: CO_XT_COMPONENTS_DE ...

  9. 【Leetcode_easy】832. Flipping an Image

    problem 832. Flipping an Image solution1: class Solution { public: vector<vector<int>> f ...

  10. ELK之7版本Elastic Maps功能介绍

    Elasticsearch 7.0 中还引入了一个新的聚合来处理地理地图图块,允许用户在地图上放大和缩小,而不会改变结果数据的形状,实现更加平滑地缩放 Elastic Maps:使用纳秒精度存储时序数 ...