zoukankan      html  css  js  c++  java
  • 数据结构-单链表-类定义C++

    原理可访问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 = 0; }
     13     ListNode(T el, ListNode* ptr = 0) {
     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 = 0;
     27         head = tail = 0; }
     28     ~List();
     29     int isEmpty() {
     30         return head == 0;
     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 == 0)
     57         tail = head;
     58 }
     59 
     60 template <class T>
     61 void List<T>::addToTail(T el) {
     62     if (tail != 0) {
     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 = 0;
     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 = 0;
     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 = 0;
     96     }
     97     return el;
     98 }
     99 
    100 template <class T>
    101 void List<T>::deleteNode(T el) {
    102     ListNode<T> *previous = 0;
    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 != 0;
    136 }
    137 /*****************************************/
    138 
    139 template <class T>
    140 void List<T>::Invert() {
    141     ListNode<T> *p = head, *q = 0;
    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 
    152 template <class T>
    153 void List<T>::disPlay() const{
    154     //ListNode<T>  *p;
    155     //p = head;
    156     //while (p)
    157     //{
    158     //    std::cout << p->data;
    159     //    if (p->next) { std::cout << "->"; } //就是仅在数字之间加"->"
    160     //    p = p->next;
    161     //}
    162     for (ListNode<T> *current = head; current; current = current->next)
    163     {
    164         std::cout << current->data;
    165         if (current->next) std::cout << "->";
    166     }
    167     std::cout << std::endl;
    168 }
    169 
    170 #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(1);
    11     ilist.addToTail(2);
    12     ilist.addToTail(3);
    13     ilist.addToTail(4);
    14     ilist.disPlay();
    15     ilist.deleteFromHead();
    16     ilist.disPlay();
    17 
    18     List<int> ilist2;
    19     ilist2.addToHead(5);
    20     ilist2.addToHead(6);
    21     ilist2.addToHead(7);
    22     ilist2.addToHead(8);
    23     ilist2.disPlay();
    24     cout << ilist2.isInList(5) << endl;
    25     ilist2.deleteFromTail();
    26     ilist2.disPlay();
    27     cout << ilist2.isInList(5) << 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 
    43 
    44     return 0;
    45 }
  • 相关阅读:
    HDFS datanode源码分析
    hive udaf开发入门和运行过程详解
    hive原生和复合类型的数据加载和使用
    tomcat部署web应用(转)
    HDFS namenode源码分析
    HDFS dfsclient写文件过程 源码分析
    hive中UDTF编写和使用(转)
    HDFS dfsclient读文件过程 源码分析
    MapReduce源码分析总结(转)
    DataRabbit 轻量的数据访问框架(09) -- IDataSchemaAccesser
  • 原文地址:https://www.cnblogs.com/yang901112/p/11779889.html
Copyright © 2011-2022 走看看