Advertisement
BeloMaximka

Belov_LW_O6

Oct 7th, 2021
784
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.87 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. template <class T>
  5. struct Elem
  6. {
  7.     T data; // данные
  8.     Elem* next, * prev;
  9. };
  10.  
  11. template <class T>
  12. class List
  13. {
  14.     Elem<T>* Head, * Tail;
  15.     int _size;
  16.     Elem<T>* getElem(int pos);
  17. public:
  18.     List();
  19.     List(const List&);
  20.     ~List();
  21.  
  22.     int size()const;
  23.  
  24.     void clear();
  25.     T pop(int pos);
  26.     T popTail();
  27.     void swap(int pos1, int pos2);
  28.  
  29.     void pushTail(T n);
  30.     void pushHead(T n);
  31.  
  32. };
  33.  
  34. template<class T>
  35. inline Elem<T>* List<T>::getElem(int pos)
  36. {
  37.     Elem<T>* temp = Head;
  38.  
  39.     if (pos < 1 || pos > _size)
  40.     {
  41.         cout << "Incorrect position !!!\n";
  42.         return 0;
  43.     }
  44.  
  45.     int i = 1;
  46.     while (i < pos && temp != 0)
  47.     {
  48.         temp = temp->next;
  49.         i++;
  50.     }
  51.  
  52.     if (temp == 0)
  53.         return 0;
  54.     else
  55.         return temp;
  56. }
  57.  
  58. template <class T>
  59. List<T>::List()
  60. {
  61.     Head = Tail = NULL;
  62.     _size = 0;
  63. }
  64.  
  65. template <class T>
  66. List<T>::List(const List& L)
  67. {
  68.     Head = Tail = NULL;
  69.     _size = 0;
  70.  
  71.     Elem<T>* temp = L.Head;
  72.     while (temp != 0)
  73.     {
  74.         pushTail(temp->data);
  75.         temp = temp->next;
  76.     }
  77. }
  78.  
  79. template <class T>
  80. List<T>::~List()
  81. {
  82.     clear();
  83. }
  84.  
  85. template <class T>
  86. void List<T>::pushHead(T n)
  87. {
  88.     Elem<T>* temp = new Elem<T>;
  89.     temp->prev = 0;
  90.     temp->data = n;
  91.     temp->next = Head;
  92.  
  93.     if (Head != 0)
  94.         Head->prev = temp;
  95.     if (_size == 0)
  96.         Head = Tail = temp;
  97.     else
  98.         Head = temp;
  99.     _size++;
  100. }
  101.  
  102. template <class T>
  103. void List<T>::pushTail(T n)
  104. {
  105.     Elem<T>* temp = new Elem<T>;
  106.     temp->next = 0;
  107.     temp->data = n;
  108.     temp->prev = Tail;
  109.  
  110.     if (Tail != 0)
  111.         Tail->next = temp;
  112.     if (_size == 0)
  113.         Head = Tail = temp;
  114.     else
  115.         Tail = temp;
  116.     _size++;
  117. }
  118.  
  119. template <class T>
  120. T List<T>::pop(int pos)
  121. {
  122.     if (pos < 1 || pos > _size)
  123.     {
  124.         cout << "Incorrect position !!!\n";
  125.         return T();
  126.     }
  127.  
  128.     int i = 1;
  129.  
  130.     Elem<T>* Del = Head;
  131.  
  132.     while (i < pos)
  133.     {
  134.         Del = Del->next;
  135.         i++;
  136.     }
  137.  
  138.     Elem<T>* PrevDel = Del->prev;
  139.     Elem<T>* AfterDel = Del->next;
  140.     if (PrevDel != 0 && _size != 1)
  141.         PrevDel->next = AfterDel;
  142.     if (AfterDel != 0 && _size != 1)
  143.         AfterDel->prev = PrevDel;
  144.     if (pos == 1)
  145.         Head = AfterDel;
  146.     if (pos == _size)
  147.         Tail = PrevDel;
  148.     T val = Del->data;
  149.     delete Del;
  150.     _size--;
  151.  
  152.     return val;
  153. }
  154.  
  155. template<class T>
  156. inline T List<T>::popTail()
  157. {
  158.     if (_size == 0) return T();
  159.     if (_size == 1)
  160.     {
  161.         T val = Tail->data;
  162.         delete Tail;
  163.         Tail = Head = nullptr;
  164.         _size--;
  165.         return val;
  166.     }
  167.     else
  168.     {
  169.         Elem<T>* del = Tail;
  170.         T val = Tail->data;
  171.         Tail->prev->next = nullptr;
  172.         Tail = Tail->prev;
  173.         delete del;
  174.         _size--;
  175.         return val;
  176.     }
  177. }
  178.  
  179. template<class T>
  180. inline void List<T>::swap(int pos1, int pos2)
  181. {
  182.     Elem<T>* temp1 = getElem(pos1);
  183.     Elem<T>* temp2 = getElem(pos2);
  184.     T temp_val = temp1->data;
  185.     temp1->data = temp2->data;
  186.     temp2->data = temp_val;
  187. }
  188.  
  189. template <class T>
  190. void List<T>::clear()
  191. {
  192.     while (_size != 0)
  193.         pop(1);
  194. }
  195.  
  196. template <class T>
  197. int List<T>::size()const
  198. {
  199.     return _size;
  200. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement