Advertisement
Foxyzboi

List

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