Advertisement
PavelMiridonov

Untitled

Jan 15th, 2021
265
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.49 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4.  
  5. /*
  6. * односвязный список
  7. * реализация
  8. */
  9.  
  10.  
  11. template<typename T>
  12. class List
  13. {
  14. public:
  15.     List();
  16.     ~List();
  17.  
  18.     //удаление первого элемента в списке
  19.     void pop_front();
  20.  
  21.     //добавление элемента в конец списка
  22.     void push_back(T data);
  23.  
  24.     // очистить список
  25.     void clear();
  26.  
  27.     // получить количество елементов в списке
  28.     int GetSize() { return Size; }
  29.  
  30.     // перегруженный оператор []
  31.     T& operator[](const int index);
  32.    
  33.     //добавление элемента в начало списка
  34.     void push_front(T data);
  35.  
  36.     //добавление элемента в список по указанному индексу
  37.     void insert(T data, int index);
  38.  
  39.     //удаление элемента в списке по указанному индексу
  40.     void removeAt(int index);
  41.    
  42.     //удаление последнего элемента в списке
  43.     void pop_back();
  44.  
  45. private:
  46.  
  47.  
  48.     template<typename T>
  49.     class Node
  50.     {
  51.     public:
  52.         Node * pNext;
  53.         T data;
  54.  
  55.         Node(T data = T(), Node *pNext = nullptr)
  56.         {
  57.             this->data = data;
  58.             this->pNext = pNext;
  59.         }
  60.     };
  61.     int Size;
  62.     Node<T> *head;
  63. };
  64.  
  65.  
  66. template<typename T>
  67. List<T>::List()
  68. {
  69.     Size = 0;
  70.     head = nullptr;
  71. }
  72.  
  73.  
  74. template<typename T>
  75. List<T>::~List()
  76. {
  77.     clear();
  78. }
  79.  
  80.  
  81. template<typename T>
  82. void List<T>::pop_front()
  83. {
  84.     Node<T> *temp = head;
  85.  
  86.     head = head->pNext;
  87.  
  88.     delete temp;
  89.  
  90.     Size--;
  91.  
  92. }
  93.  
  94. template<typename T>
  95. void List<T>::push_back(T data)
  96. {
  97.     if (head == nullptr)
  98.     {
  99.         head = new Node<T>(data);
  100.     }
  101.     else
  102.     {
  103.         Node<T> *current = this->head;
  104.  
  105.         while (current->pNext != nullptr)
  106.         {
  107.             current = current->pNext;
  108.         }
  109.         current->pNext = new Node<T>(data);
  110.  
  111.     }
  112.  
  113.     Size++;
  114. }
  115.  
  116. template<typename T>
  117. void List<T>::clear()
  118. {
  119.     while (Size)
  120.     {
  121.         pop_front();
  122.     }
  123. }
  124.  
  125.  
  126. template<typename T>
  127. T & List<T>::operator[](const int index)
  128. {
  129.     int counter = 0;
  130.  
  131.     Node<T> *current = this->head;
  132.  
  133.     while (current != nullptr)
  134.     {
  135.         if (counter == index)
  136.         {
  137.             return current->data;
  138.         }
  139.         current = current->pNext;
  140.         counter++;
  141.     }
  142. }
  143.  
  144. template<typename T>
  145. void List<T>::push_front(T data)
  146. {
  147.     head = new Node<T>(data, head);
  148.     Size++;
  149. }
  150.  
  151. template<typename T>
  152. void List<T>::insert(T data, int index)
  153. {
  154.  
  155.     if (index == 0)
  156.     {
  157.         push_front(data);
  158.     }
  159.     else
  160.     {
  161.         Node<T> *previous = this->head;
  162.  
  163.         for (int i = 0; i < index - 1; i++)
  164.         {
  165.             previous = previous->pNext;
  166.         }
  167.  
  168.         Node<T> *newNode = new Node<T>(data, previous->pNext);
  169.  
  170.         previous->pNext = newNode;
  171.  
  172.         Size++;
  173.     }
  174.  
  175.  
  176.  
  177.  
  178.  
  179. }
  180.  
  181. template<typename T>
  182. void List<T>::removeAt(int index)
  183. {
  184.     if (index == 0)
  185.     {
  186.         pop_front();
  187.     }
  188.     else
  189.     {
  190.         Node<T> *previous = this->head;
  191.         for (int i = 0; i < index - 1; i++)
  192.         {
  193.             previous = previous->pNext;
  194.         }
  195.  
  196.        
  197.         Node<T> *toDelete = previous->pNext;
  198.  
  199.         previous->pNext = toDelete->pNext;
  200.  
  201.         delete toDelete;
  202.  
  203.         Size--;
  204.     }
  205.  
  206. }
  207.  
  208. template<typename T>
  209. void List<T>::pop_back()
  210. {
  211.     removeAt(Size - 1);
  212. }
  213.  
  214.  
  215.  
  216. int main()
  217. {
  218.  
  219.     setlocale(LC_ALL, "ru");
  220.  
  221.  
  222.     List<int> lst;
  223.     lst.push_front(5);
  224.     lst.push_front(7);
  225.     lst.push_front(101);
  226.  
  227.     for (int i = 0; i < lst.GetSize(); i++)
  228.     {
  229.         cout << lst[i] << endl;
  230.     }
  231.  
  232.     cout << endl << "pop_back " << endl << endl;
  233.  
  234.     lst.pop_back();
  235.  
  236.     for (int i = 0; i < lst.GetSize(); i++)
  237.     {
  238.         cout << lst[i] << endl;
  239.     }
  240.  
  241.     return 0;
  242. }
  243.  
  244.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement