zoukankan      html  css  js  c++  java
  • 36.创建模板mylist

    • node.h
      1 #pragma once
      2 //创建模板
      3 template <class T>
      4 class Node
      5 {
      6 public:
      7     T t;//数据
      8     Node *pNext;//指针域
      9 };
    • list.h
       1 #pragma once
       2 #include "Node.h"
       3 #include <iostream>
       4 using namespace std;
       5 
       6 template <class T>
       7 class List
       8 {
       9 public:
      10     Node<T> *pHead;
      11 
      12 public:
      13     List();
      14     void add(T t);//尾部插入
      15     void show();//显示
      16     Node<T> * find(T t);//查找
      17     void change(Node<T> *p, T newt);//修改
      18     int getnum();//获取个数
      19     bool deletet(T t);
      20     void sort();
      21     void deletesame();//删除相同的元素
      22     bool clear();
      23     void rev();
      24 
      25     void insert(T oldt, T newt);
      26     void merge(List & list);
      27 
      28     ~List();
      29 };
    • list.cpp
        1 #include "List.h"
        2 
        3 
        4 template <class T>
        5 List<T>::List()
        6 {
        7     this->pHead = nullptr;//设置空节点 
        8     cout << "链表创建" << endl;
        9 
       10 }
       11 
       12 
       13 template <class T>
       14 List<T>::~List()
       15 {
       16     cout << "链表销毁" << endl;
       17 
       18 }
       19 template <class T>
       20 void List<T>::add(T t)
       21 {
       22     Node<T> *pnew = new Node<T>;//分配节点
       23     pnew->t = t;//赋值
       24     pnew->pNext = nullptr;
       25 
       26 
       27     if (pHead==nullptr)
       28     {
       29         
       30         this->pHead = pnew;//头结点
       31 
       32     } 
       33     else
       34     {
       35         Node<T> *p = pHead;//获取头结点位置
       36         while (p->pNext!=nullptr)//循环到尾部
       37         {
       38             p = p->pNext;
       39 
       40         }
       41         p->pNext = pnew;
       42 
       43     }
       44 
       45 }
       46 
       47 
       48 template <class T>
       49 void List<T>::show()
       50 {
       51 
       52     Node<T> *p = pHead;//获取头结点位置
       53     while (p!= nullptr)//循环到尾部
       54     {
       55 
       56         cout << p->t << "  ";
       57         p = p->pNext;
       58 
       59     }
       60     cout << endl;
       61 
       62 }
       63 
       64 template <class T>
       65 Node<T> * List<T>::find(T t)
       66 {
       67     Node<T> *p = pHead;//获取头结点位置
       68     while (p != nullptr)//循环到尾部
       69     {
       70         if (p->t==t)
       71         {
       72             return p;
       73         }
       74     
       75         p = p->pNext;
       76 
       77     }
       78     return nullptr;
       79 
       80 
       81 }
       82 
       83 template <class T>
       84 void List<T>::change(Node<T> *p, T newt)
       85 {
       86     if (p==nullptr)
       87     {
       88         return;
       89     }
       90 
       91     p->t = newt;
       92 }
       93 
       94 template <class T>
       95 int  List<T>::getnum()
       96 {
       97     int i = 0;
       98     Node<T> *p = pHead;//获取头结点位置
       99     while (p != nullptr)//循环到尾部
      100     {
      101 
      102         i++;
      103         p = p->pNext;
      104 
      105     }
      106 
      107     return i;
      108 
      109 
      110 }
      111 template <class T>
      112 bool List<T>::deletet(T t)
      113 {
      114 
      115     Node<T> *p = this->find(t);
      116     if (p==nullptr)
      117     {
      118         return  false;
      119     }
      120     else
      121     {
      122         
      123         if (p==pHead)//头结点
      124         {
      125             pHead = p->pNext;
      126             delete p;
      127         }
      128         else
      129         {
      130             Node<T> *p1, *p2;
      131             p1 = pHead;
      132             p2 = p1->pNext;
      133             while (p2!=p)//删除一个节点,获取前一个节点
      134             {
      135                 p1 = p2;
      136                 p2 = p2->pNext;
      137                 
      138             }
      139 
      140             p1->pNext = p2->pNext;//跳过p2
      141             delete p2;
      142 
      143 
      144 
      145         }
      146         return true;
      147     }
      148 }
      149 
      150 
      151 template <class T>
      152 void List<T>::sort()
      153 {
      154     for (Node<T> *p1 = pHead; p1 != NULL;p1=p1->pNext)
      155     {
      156         for (Node<T> *p2 = pHead; p2!= NULL; p2 = p2->pNext)
      157         {
      158             if (p1->t < p2->t)
      159             {
      160                 T temp;
      161                 temp = p1->t;
      162                 p1->t = p2->t;
      163                 p2 -> t = temp;
      164 
      165             }
      166         }
      167     }
      168 }
      169 
      170 template<class T>
      171 void List<T>::deletesame()//重新生成
      172 {
      173 
      174         Node<T> *p1, *p2;
      175         p1 = pHead->pNext;
      176         p2 = pHead;
      177         while (p1!=nullptr)
      178         {
      179             if (p1->t==p2->t)
      180             {
      181                 //cout << "=";
      182                 p2->pNext = p1->pNext;
      183                 delete p1;
      184                 p1 = p2->pNext;
      185             }
      186             else
      187             {
      188                 p2 =p1;
      189                 p1 = p1->pNext;
      190 
      191             }
      192         }
      193 }
      194 
      195 template<class T>
      196 bool List<T>::clear()
      197 {
      198     if (pHead ==nullptr)
      199     {
      200         return false;
      201     }
      202 
      203 
      204     Node<T> *p1, *p2;
      205     p1 = pHead->pNext;
      206     while (p1!=nullptr)
      207     {
      208         p2 = p1->pNext;
      209         delete p1;
      210         p1 = p2;
      211     }
      212     delete pHead;
      213     pHead = nullptr;
      214 
      215     return true;
      216 
      217 
      218 }
      219 template<class T>
      220 //递归
      221 void  List<T>::rev()
      222 {
      223     if (pHead==nullptr || pHead->pNext==nullptr)
      224     {
      225         return;
      226     } 
      227     else
      228     {
      229         Node<T> *p1, *p2, *p3;
      230         p1 = pHead;
      231         p2 = p1->pNext;
      232 
      233 
      234         while (p2!=nullptr)
      235         {
      236             p3 = p2->pNext;
      237             p2->pNext = p1;
      238 
      239             p1 = p2;
      240             p2 = p3;
      241 
      242         }
      243         pHead->pNext= nullptr;
      244         pHead = p1;
      245 
      246 
      247     }
      248 
      249 
      250 }
      251 template<class T>
      252 void  List<T>::insert(T oldt, T newt)
      253 {
      254 
      255     Node<T> *p = find(oldt);
      256     if (p!=nullptr)
      257     {
      258 
      259         Node<T> *p1, *p2;
      260         p1 = pHead;
      261         p2 = p1->pNext;
      262         while (p2 != p)
      263         {
      264             p1 = p2;
      265             p2 = p2->pNext;
      266 
      267         }
      268         Node<T> *pnew = new Node<T>;
      269         pnew->t = newt;
      270         pnew->pNext = p2;
      271         p1->pNext = pnew;
      272     }
      273 }
      274 
      275 template<class T>
      276 void  List<T>::merge(List & list)
      277 {
      278     Node<T> *p = pHead;//获取头结点位置
      279     while (p->pNext != nullptr)//循环到尾部
      280     {
      281 
      282         p = p->pNext;
      283 
      284     }
      285     p->pNext = list.pHead;
      286 }
    • main.cpp
        1 #include "List.h"
        2 
        3 
        4 template <class T>
        5 List<T>::List()
        6 {
        7     this->pHead = nullptr;//设置空节点 
        8     cout << "链表创建" << endl;
        9 
       10 }
       11 
       12 
       13 template <class T>
       14 List<T>::~List()
       15 {
       16     cout << "链表销毁" << endl;
       17 
       18 }
       19 template <class T>
       20 void List<T>::add(T t)
       21 {
       22     Node<T> *pnew = new Node<T>;//分配节点
       23     pnew->t = t;//赋值
       24     pnew->pNext = nullptr;
       25 
       26 
       27     if (pHead==nullptr)
       28     {
       29         
       30         this->pHead = pnew;//头结点
       31 
       32     } 
       33     else
       34     {
       35         Node<T> *p = pHead;//获取头结点位置
       36         while (p->pNext!=nullptr)//循环到尾部
       37         {
       38             p = p->pNext;
       39 
       40         }
       41         p->pNext = pnew;
       42 
       43     }
       44 
       45 }
       46 
       47 
       48 template <class T>
       49 void List<T>::show()
       50 {
       51 
       52     Node<T> *p = pHead;//获取头结点位置
       53     while (p!= nullptr)//循环到尾部
       54     {
       55 
       56         cout << p->t << "  ";
       57         p = p->pNext;
       58 
       59     }
       60     cout << endl;
       61 
       62 }
       63 
       64 template <class T>
       65 Node<T> * List<T>::find(T t)
       66 {
       67     Node<T> *p = pHead;//获取头结点位置
       68     while (p != nullptr)//循环到尾部
       69     {
       70         if (p->t==t)
       71         {
       72             return p;
       73         }
       74     
       75         p = p->pNext;
       76 
       77     }
       78     return nullptr;
       79 
       80 
       81 }
       82 
       83 template <class T>
       84 void List<T>::change(Node<T> *p, T newt)
       85 {
       86     if (p==nullptr)
       87     {
       88         return;
       89     }
       90 
       91     p->t = newt;
       92 }
       93 
       94 template <class T>
       95 int  List<T>::getnum()
       96 {
       97     int i = 0;
       98     Node<T> *p = pHead;//获取头结点位置
       99     while (p != nullptr)//循环到尾部
      100     {
      101 
      102         i++;
      103         p = p->pNext;
      104 
      105     }
      106 
      107     return i;
      108 
      109 
      110 }
      111 template <class T>
      112 bool List<T>::deletet(T t)
      113 {
      114 
      115     Node<T> *p = this->find(t);
      116     if (p==nullptr)
      117     {
      118         return  false;
      119     }
      120     else
      121     {
      122         
      123         if (p==pHead)//头结点
      124         {
      125             pHead = p->pNext;
      126             delete p;
      127         }
      128         else
      129         {
      130             Node<T> *p1, *p2;
      131             p1 = pHead;
      132             p2 = p1->pNext;
      133             while (p2!=p)//删除一个节点,获取前一个节点
      134             {
      135                 p1 = p2;
      136                 p2 = p2->pNext;
      137                 
      138             }
      139 
      140             p1->pNext = p2->pNext;//跳过p2
      141             delete p2;
      142 
      143 
      144 
      145         }
      146         return true;
      147     }
      148 }
      149 
      150 
      151 template <class T>
      152 void List<T>::sort()
      153 {
      154     for (Node<T> *p1 = pHead; p1 != NULL;p1=p1->pNext)
      155     {
      156         for (Node<T> *p2 = pHead; p2!= NULL; p2 = p2->pNext)
      157         {
      158             if (p1->t < p2->t)
      159             {
      160                 T temp;
      161                 temp = p1->t;
      162                 p1->t = p2->t;
      163                 p2 -> t = temp;
      164 
      165             }
      166         }
      167     }
      168 }
      169 
      170 template<class T>
      171 void List<T>::deletesame()//重新生成
      172 {
      173 
      174         Node<T> *p1, *p2;
      175         p1 = pHead->pNext;
      176         p2 = pHead;
      177         while (p1!=nullptr)
      178         {
      179             if (p1->t==p2->t)
      180             {
      181                 //cout << "=";
      182                 p2->pNext = p1->pNext;
      183                 delete p1;
      184                 p1 = p2->pNext;
      185             }
      186             else
      187             {
      188                 p2 =p1;
      189                 p1 = p1->pNext;
      190 
      191             }
      192         }
      193 }
      194 
      195 template<class T>
      196 bool List<T>::clear()
      197 {
      198     if (pHead ==nullptr)
      199     {
      200         return false;
      201     }
      202 
      203 
      204     Node<T> *p1, *p2;
      205     p1 = pHead->pNext;
      206     while (p1!=nullptr)
      207     {
      208         p2 = p1->pNext;
      209         delete p1;
      210         p1 = p2;
      211     }
      212     delete pHead;
      213     pHead = nullptr;
      214 
      215     return true;
      216 
      217 
      218 }
      219 template<class T>
      220 //递归
      221 void  List<T>::rev()
      222 {
      223     if (pHead==nullptr || pHead->pNext==nullptr)
      224     {
      225         return;
      226     } 
      227     else
      228     {
      229         Node<T> *p1, *p2, *p3;
      230         p1 = pHead;
      231         p2 = p1->pNext;
      232 
      233 
      234         while (p2!=nullptr)
      235         {
      236             p3 = p2->pNext;
      237             p2->pNext = p1;
      238 
      239             p1 = p2;
      240             p2 = p3;
      241 
      242         }
      243         pHead->pNext= nullptr;
      244         pHead = p1;
      245 
      246 
      247     }
      248 
      249 
      250 }
      251 template<class T>
      252 void  List<T>::insert(T oldt, T newt)
      253 {
      254 
      255     Node<T> *p = find(oldt);
      256     if (p!=nullptr)
      257     {
      258 
      259         Node<T> *p1, *p2;
      260         p1 = pHead;
      261         p2 = p1->pNext;
      262         while (p2 != p)
      263         {
      264             p1 = p2;
      265             p2 = p2->pNext;
      266 
      267         }
      268         Node<T> *pnew = new Node<T>;
      269         pnew->t = newt;
      270         pnew->pNext = p2;
      271         p1->pNext = pnew;
      272     }
      273 }
      274 
      275 template<class T>
      276 void  List<T>::merge(List & list)
      277 {
      278     Node<T> *p = pHead;//获取头结点位置
      279     while (p->pNext != nullptr)//循环到尾部
      280     {
      281 
      282         p = p->pNext;
      283 
      284     }
      285     p->pNext = list.pHead;
      286 }
  • 相关阅读:
    通过连接池和字段索引,提升单点登录cas的性能
    crc16.c
    modbus.c
    sciencesoftware科学软件
    C++ ASSERT() 断言机制
    sessionKey
    main函数中argc理解
    compile,build和execute的区别
    Linux vi 中移动光标 命令
    OCP读书笔记(2)
  • 原文地址:https://www.cnblogs.com/xiaochi/p/8652515.html
Copyright © 2011-2022 走看看