• c++ 模板 链表实现


      1 #include <iostream>
      2 
      3 using namespace std;
      4 
      5 class A;
      6 
      7 template<class Node>
      8 class ListNode
      9 {
     10     public:
     11         //explicit ListNode();
     12         ListNode();
     13         ~ListNode();
     14         ListNode *next;
     15         Node info;
     16 };
     17 
     18 template<class Node>
     19 ListNode<Node>::ListNode()
     20 {
     21     
     22 }
     23 
     24 template<class Node>
     25 ListNode<Node>::~ListNode()
     26 {
     27 }
     28 
     29 class A
     30 {    
     31     public:
     32         A();
     33         A(int a);
     34         A(const A& a);
     35         ~A();
     36         bool operator ==(const A& a1);
     37         int id;
     38 
     39 };
     40 
     41 A::A()
     42 {
     43 }
     44 
     45 A::A(int a )
     46 {
     47     id = a ;
     48     
     49 }
     50 
     51 A::A(const A& a)
     52 {
     53     id = a.id;
     54 
     55     cout<<"test"<<endl;
     56 
     57 }
     58 
     59 A::~A()
     60 {
     61 
     62 }
     63 
     64 bool A::operator ==(const A& a1)
     65 {
     66 
     67 }
     68 
     69 template<class T >
     70 class List
     71 {
     72     public:
     73         List();
     74         ~List();
     75         void insert(const T& item);
     76         void insert(const T& item,int pos);
     77         void append(const T& item);
     78         ListNode<T> *reverse();
     79         //int find(const T& item);
     80         int find_first(const T& item);
     81         int find_end(const T& item);
     82         // remove(const T& item);
     83         bool remove(int pos);
     84 
     85         void printList();
     86         void printList(ListNode<T> *list);
     87 
     88         ListNode< T> *head;
     89         int position ;
     90 };
     91 
     92 template<class T>
     93 List<T>::List()
     94 {
     95     head = NULL;
     96     position = 0;
     97 }
     98 
     99 template<class T>
    100 List<T>::~List()
    101 {
    102 }
    103 
    104 template<class T>
    105 void List<T>::insert(const T& item)
    106 {
    107 
    108     ListNode<T> *listNode= new ListNode<T>();
    109     listNode->next = head;
    110     listNode->info = item;
    111 
    112     head = listNode;
    113 
    114     position +=1;
    115 }
    116 
    117 template<class T>
    118 void List<T>::insert(const T& item,int pos)
    119 {
    120     if (position<-1 || pos >position )
    121     {
    122         return;
    123     }
    124 
    125     if(pos ==0)
    126     {
    127         insert(item);
    128     }
    129     else
    130     {
    131         ListNode<T> *tmp = head;
    132 
    133         for (int i = 0; i < pos; i++)
    134         {
    135             tmp = tmp->next;
    136         }
    137 
    138         ListNode<T> *node = tmp->next;
    139 
    140         ListNode<T> *listNode= new ListNode<T>();
    141         listNode->next = node;
    142         listNode->info = item;
    143 
    144         tmp->next = listNode;
    145 
    146         position +=1;
    147     }
    148 }
    149 
    150 template<class T>
    151 void List<T>::append(const T& item)
    152 {
    153     if(head !=NULL)
    154     {
    155         ListNode<T> *tmp = head;
    156 
    157         while(tmp->next !=NULL)
    158         {
    159             tmp = tmp->next;
    160         }
    161 
    162         ListNode<T> *listNode= new ListNode<T>();
    163         listNode->next = NULL;
    164         listNode->info = item;
    165 
    166         tmp->next = listNode;
    167 
    168         position +=1;
    169     }
    170     else
    171     {
    172         insert(item);
    173     }
    174 }
    175 
    176 /*template<class T>
    177 void List<T>::remove(const T& item)
    178 {
    179     ListNode<T> *tmp = head;
    180 
    181     while(tmp !=NULL)
    182     {
    183         if(tmp->info == item)
    184         {
    185             
    186         }
    187 
    188         tmp = tmp->next;
    189     }
    190 }*/
    191 
    192 template<class T>
    193 bool List<T>::remove(int pos)
    194 {
    195     if(head == NULL || pos<-1 || pos>position)
    196         return false;
    197 
    198     if(head !=NULL)
    199     {
    200         ListNode<T> *currentNode =  head;
    201 
    202         int i = 0;
    203 
    204         while(currentNode !=NULL)
    205         {
    206             i++;
    207 
    208             if(i == pos)
    209                 break;
    210 
    211             currentNode = currentNode->next;
    212         }
    213 
    214         ListNode<T> *tmp = currentNode->next;
    215 
    216         currentNode->next = tmp->next->next;
    217 
    218         delete tmp;
    219         tmp = NULL;
    220 
    221         position-=1;
    222 
    223     }
    224 }
    225 
    226 template<class T>
    227 int List<T>::find_first(const T& item)
    228 {
    229     if(head != NULL)
    230     {
    231         ListNode<T> *currentNode = head;
    232         int i = 0;
    233 
    234         while(currentNode !=NULL)
    235         {
    236             i++;
    237             if(currentNode->info == item)
    238             {
    239                 cout<<item<<endl;
    240                 break;
    241             }
    242 
    243             currentNode = currentNode->next;
    244     }
    245 
    246         return i;
    247 
    248     }else
    249     {
    250         return -1;
    251     }
    252 }
    253 
    254 template<class T>
    255 int List<T>::find_end(const T& item)
    256 {
    257     if(head != NULL)
    258     {
    259         ListNode<T> *currentNode = head;
    260         int i = 0;
    261         int pos = 0;
    262 
    263         while(currentNode !=NULL)
    264         {
    265             i++;
    266             if(currentNode->info == item)
    267             {
    268                 pos = i;
    269             }
    270 
    271             currentNode = currentNode->next;
    272     }
    273 
    274         return pos;
    275 
    276     }else
    277     {
    278         return -1;
    279     }
    280 }
    281 
    282 template<class T>
    283 ListNode<T> *List<T>::reverse()
    284 {
    285     if(head !=NULL)    
    286     {
    287         ListNode<T> *tmp = head;
    288         ListNode<T> *newList  =  new ListNode<T>();
    289         newList->info = tmp->info;
    290         newList->next = NULL;
    291 
    292         ListNode<T> *swap;
    293 
    294         while(tmp->next !=NULL)
    295         {
    296             swap = newList->next;
    297             newList->next = tmp->next;
    298             tmp->next = tmp->next->next;
    299             newList->next->next = swap;
    300         }
    301 
    302         return newList;
    303 
    304     }
    305     else
    306     {
    307         return NULL;
    308     }
    309 }
    310 
    311 
    312 template<class T>
    313 void List<T>::printList()
    314 {
    315 
    316     ListNode<T> *tmp = head;
    317 
    318     while(tmp !=NULL)
    319     {
    320         cout<<tmp->info<<endl;
    321         tmp = tmp->next;
    322     }
    323 }
    324 
    325 template<class T>
    326 void List<T>::printList(ListNode<T> *list)
    327 {
    328 
    329     ListNode<T> *tmp = list;
    330 
    331     while(tmp !=NULL)
    332     {
    333         cout<<tmp->info<<endl;
    334         tmp = tmp->next;
    335     }
    336 }
    337 
    338 
    339 int main()
    340 {
    341     List<int> *list = new List<int>;
    342 
    343     for (int i = 0; i < 10; i++)
    344     {
    345         list->insert(i);
    346     }
    347 
    348     list->insert(12,0);
    349     list->insert(0,2);
    350     list->insert(5,3);
    351     list->insert(5,7);
    352 
    353     list->append(122);
    354     list->append(130);
    355 
    356     ListNode<int> *node = new ListNode<int>();
    357 
    358     ListNode<int> *tmp = node;
    359 
    360     cout<<"find first = "<<list->find_first(5)<<endl;
    361     cout<<"find end = "<<list->find_end(5)<<endl;
    362 
    363     list->remove(5);
    364     list->remove(6);
    365 
    366     list->printList();
    367 
    368     cout<<"*******************************************************"<<endl;
    369 
    370 
    371     ListNode<int> *tmplist = list->reverse();
    372 
    373     list->printList(tmplist);
    374 
    375 
    376     delete list;
    377 
    378 
    379     List<A> *alist = new List<A>;
    380 
    381     for(int i=0;i<5;i++)
    382     {
    383         A a(i);
    384         alist->insert(a);
    385     }
    386 }

    以上是使用模板实现的数据结构

  • 相关阅读:
    leetcode 122. Best Time to Buy and Sell Stock II
    leetcode 121. Best Time to Buy and Sell Stock
    python 集合(set)和字典(dictionary)的用法解析
    leetcode 53. Maximum Subarray
    leetcode 202. Happy Number
    leetcode 136.Single Number
    leetcode 703. Kth Largest Element in a Stream & c++ priority_queue & minHeap/maxHeap
    [leetcode]1379. Find a Corresponding Node of a Binary Tree in a Clone of That Tree
    正则表达式
    十种排序算法
  • 原文地址:https://www.cnblogs.com/jjxxjnzy/p/3430417.html
Copyright © 2020-2023  润新知