c++模版链表的实现

来源:互联网 发布:开淘宝店自己没有货 编辑:程序博客网 时间:2024/06/05 01:51
[cpp] view plain copy
  1. <strong><span style="font-size:18px;">#define _CRT_SECURE_NO_WARNINGS 1  
  2.   
  3. #include<iostream>  
  4. #include<string>  
  5. #include<cassert>  
  6. using namespace std;  
  7.   
  8. template<typename T>  
  9. struct Node  
  10. {  
  11.     Node()  
  12.     :_next(NULL)  
  13.     {}  
  14.     ~Node()  
  15.     {  
  16.     }  
  17. public:  
  18.     T _data;  
  19.     Node* _next;  
  20.   
  21. };  
  22.   
  23. template <typename T>  
  24. class LinkList  
  25. {  
  26.       
  27. public:  
  28.     LinkList();  
  29.     ~LinkList();  
  30.     LinkList(const LinkList<T> & list);  
  31.     LinkList<T>& operator =(const LinkList<T> list);  
  32.     void PushBack(const T& data);  //尾插  
  33.     void Display();  
  34.     void PushFront(const T& data);//头插  
  35.     void PopBack(); //尾删  
  36.     void PopFront();//头删  
  37.     void Insert(Node<T> *pos, const T& data);  
  38.   
  39.     void Remove(const T& data);  
  40.     void RemoveAll(const T& data);  
  41.     void Sort();  
  42.     void Erase(Node<T>* pos);  
  43.     void Size();  
  44.     Node<T>* Find(const T& data);  
  45.   
  46. private:  
  47.     Node<T>* _head;  
  48.     Node<T>* _tail;  
  49. };  
  50.   
  51. template<typename T>  
  52. LinkList<T>::LinkList()  
  53. :_head(NULL)  
  54. , _tail(NULL)  
  55. {  
  56.   
  57. }  
  58.   
  59. template<typename T>  
  60. LinkList<T>::~LinkList()  
  61. {  
  62.     Node <T>*cur = _head;  
  63.     while (cur)  
  64.     {  
  65.         Node<T>*del = cur;  
  66.         cur=cur->_next;  
  67.         delete del;  
  68.     }  
  69. }  
  70.   
  71. template<typename T>  
  72. LinkList<T>::LinkList(const LinkList & list)  
  73.     :_head(NULL)  
  74.     , _tail(NULL)  
  75. {  
  76.     Node <T>*cur = list._head;  
  77.     while (cur != NULL)  
  78.     {  
  79.         PushBack(cur->_data);  
  80.         cur = cur->_next;  
  81.     }  
  82.   
  83. }  
  84.   
  85. template<typename T>  
  86. LinkList<T>& LinkList<T>::operator =( LinkList<T> list)  
  87. {  
  88.     std::swap(_head, list._head);  
  89.     std::swap(_tail, list._tail);  
  90.     return *this;  
  91. }  
  92.   
  93. template<typename T>  
  94. void LinkList<T>::PushBack(const T& data)  
  95. {  
  96.     if (_head == NULL)  
  97.     {  
  98.         _head = new Node<T>;  
  99.         _head->_data = data;  
  100.         _tail = _head;  
  101.     }  
  102.     else  
  103.     {  
  104.         Node<T> *tmp = new Node<T>;  
  105.         tmp->_data = data;  
  106.         tmp->_next = NULL;  
  107.         _tail->_next = tmp;  
  108.         _tail = tmp;  
  109.     }  
  110. }  
  111.   
  112. template<typename T>  
  113. void LinkList<T>::Display()  
  114. {  
  115.     Node<T>* cur = _head;  
  116.     while (cur)  
  117.     {  
  118.         cout << cur->_data << " ";  
  119.         cur = cur->_next;  
  120.     }  
  121.     cout << endl;  
  122. }  
  123.   
  124. template<typename T>  
  125. void LinkList<T>::PushFront(const T& data)  
  126. {  
  127.     Node<T>*tmp = new Node<T>;  
  128.     tmp->_data = data;  
  129.     Node <T>*cur = _head;  
  130.     _head = tmp;  
  131.     tmp->_next = cur;  
  132. }  
  133.   
  134.   
  135. template<typename T>  
  136. void LinkList<T>::PopBack()  
  137. {  
  138.     Node <T>*cur = _head;  
  139.     Node <T>*del = NULL;  
  140.     if (_head == NULL)  
  141.     {  
  142.         return;  
  143.     }  
  144.     else if (_head == _tail)  
  145.     {  
  146.         del = _head;  
  147.         delete del;  
  148.         _head = _tail = NULL;  
  149.     }  
  150.     else  
  151.     {  
  152.         while (cur->_next != _tail)  
  153.         {  
  154.             cur = cur->_next;  
  155.         }  
  156.         delete _tail;  
  157.         _tail = cur;  
  158.         _tail->_next = NULL;  
  159.   
  160.     }  
  161. }  
  162.   
  163. template<typename T>  
  164. void LinkList<T>::PopFront()  
  165. {  
  166.     if (_head == NULL)  
  167.     {  
  168.         return;  
  169.     }  
  170.     else  
  171.     {  
  172.         Node<T>* cur = _head;  
  173.         Node<T>* del = NULL;  
  174.         del = _head;  
  175.         _head = _head->_next;  
  176.         delete del;  
  177.         del = NULL;  
  178.     }  
  179. }  
  180. template<typename T>  
  181. Node<T>* LinkList<T>::Find(const T& data)  
  182. {  
  183.     Node<T>* cur = _head;  
  184.     while (cur)  
  185.     {  
  186.         if (cur->_data == data)  
  187.         {  
  188.             return cur;  
  189.         }  
  190.         cur = cur->_next;  
  191.     }  
  192.     return NULL;  
  193. }  
  194. template<typename T>  
  195. void LinkList<T>::Insert(Node<T>* pos, const T& data)  
  196. {  
  197.     if (pos == NULL)  
  198.     {  
  199.         return;  
  200.     }  
  201.     Node<T>* newnode = new Node<T>;  
  202.     newnode->_data = data;  
  203.     Node<T>* cur = _head;  
  204.     Node<T>* prev = NULL;  
  205.     while (cur != NULL)  
  206.     {  
  207.         if (pos == cur)  
  208.         {  
  209.             break;  
  210.         }  
  211.         prev = cur;  
  212.         cur = cur->_next;  
  213.     }  
  214.     if (prev == NULL)  
  215.     {  
  216.         _head->_next = newnode;  
  217.         newnode->_next = cur;  
  218.     }  
  219.     else  
  220.     {  
  221.         prev->_next = newnode;  
  222.         newnode->_next = cur;  
  223.     }  
  224. }  
  225.   
  226. template<typename T>  
  227. void LinkList<T>::Remove(const T& data)  
  228. {  
  229.     if (_head == NULL)  
  230.     {  
  231.         return;  
  232.     }  
  233.     Node<T> *cur = _head;  
  234.     Node<T> *prev = NULL;  
  235.     Node<T> *del = NULL;  
  236.     while (cur != NULL)  
  237.     {  
  238.         if (cur->_data == data)  
  239.         {  
  240.             if (cur == _head)  
  241.             {  
  242.                 del = cur;  
  243.                 _head = cur->_next;  
  244.                 delete del;  
  245.                 del = NULL;  
  246.             }  
  247.             else  
  248.             {  
  249.                 del = cur;  
  250.                 prev->_next = cur->_next;  
  251.                 delete del;  
  252.                 del = NULL;  
  253.             }  
  254.             return;  
  255.         }  
  256.         else  
  257.         {  
  258.             prev = cur;  
  259.             cur = cur->_next;  
  260.         }  
  261.     }  
  262. }  
  263.   
  264. template<typename T>  
  265. void LinkList<T>::RemoveAll(const T& data)  
  266. {  
  267.     if (_head == NULL)  
  268.     {  
  269.         return;  
  270.     }  
  271.     Node<T> *cur = _head;  
  272.     Node<T> *del = NULL;  
  273.     Node<T> *prev = cur;  
  274.     while (cur != NULL)  
  275.     {  
  276.         if (cur->_data == data)  
  277.         {  
  278.             if (cur == _head)  
  279.             {  
  280.                 del = cur;  
  281.                 prev = cur->_next;  
  282.                 _head = cur->_next;  
  283.                 delete del;  
  284.                 del = NULL;  
  285.             }  
  286.             else  
  287.             {  
  288.                 del = cur;  
  289.                 prev->_next = cur->_next;  
  290.                 delete del;  
  291.                 del = NULL;  
  292.             }  
  293.             cur = prev;  
  294.         }  
  295.         else  
  296.         {  
  297.             prev = cur;  
  298.             cur = cur->_next;  
  299.         }  
  300.     }  
  301. }  
  302.   
  303. template<typename T>  
  304. void LinkList<T>::Sort()  
  305. {  
  306.     if ((_head == NULL) || (_head->_next == NULL))  
  307.     {  
  308.         return;  
  309.     }  
  310.     Node<T>* cur = _head;  
  311.     Node<T>* tail = NULL;  
  312.     while (cur != tail)  
  313.     {  
  314.         while (cur->_next != tail)  
  315.         {  
  316.             if (cur->_data > cur->_next->_data)  
  317.             {  
  318.                 std::swap(cur->_data, cur->_next->_data);  
  319.             }  
  320.             cur = cur->_next;  
  321.         }  
  322.         tail = cur;  
  323.         cur = _head;  
  324.     }  
  325. }  
  326.   
  327. template<typename T>  
  328. void LinkList<T>::    Erase(Node<T>* pos)  
  329. {  
  330.     if (_head == NULL)  
  331.     {  
  332.         return;  
  333.     }  
  334.     Node<T> *cur = _head;  
  335.     Node<T> *del = NULL;  
  336.     Node<T> *prev = _head;  
  337.     while (cur != NULL)  
  338.     {  
  339.         if (pos == cur)  
  340.         {  
  341.             if (pos == _head)  
  342.             {  
  343.                 del = pos;  
  344.                 _head = cur->_next;  
  345.                 delete del;  
  346.   
  347.                 del = NULL;  
  348.             }  
  349.             else  
  350.             {  
  351.                 del = pos;  
  352.                 prev->_next = cur->_next;  
  353.                 delete del;  
  354.                 del = NULL;  
  355.             }  
  356.             return;  
  357.         }  
  358.         else  
  359.         {  
  360.             prev = cur;  
  361.             cur = cur->_next;  
  362.         }  
  363.   
  364.   
  365.     }  
  366. }  
  367.   
  368. template<typename T>  
  369. void LinkList<T>::Size()  
  370. {  
  371.     Node<T>*cur = _head;  
  372.     int count = 0;  
  373.     while (cur != NULL)  
  374.     {  
  375.         count++;  
  376.         cur = cur->_next;  
  377.     }  
  378.     cout<<count<<endl;  
  379. }  
  380.   
  381. int main()  
  382. {  
  383.     LinkList<int> l;  
  384.     /*l.PushFront(1); 
  385.     l.PushFront(2); 
  386.     l.PushFront(3); 
  387.     l.PushFront(4);*/  
  388.     //l.Display();  
  389.     l.PushBack(4);  
  390.     l.PushBack(3);  
  391.     l.PushBack(2);  
  392.     l.PushBack(1);  
  393.     l.PushBack(1);  
  394.     l.Display();  
  395.     l.Size();  
  396.     //l.Remove(1);  
  397.     //l.Display();  
  398.     l.RemoveAll(1);  
  399.     l.Display();  
  400.     system("pause");  
  401.     return 0;  
  402. }</span></strong>  
原创粉丝点击