Advertisement
Neveles

doubleList

Dec 8th, 2019
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.10 KB | None | 0 0
  1. #pragma once
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. template<typename T>
  6. struct Node {                                  // структура узел          
  7.     T x;                                       // информационное поле узла
  8.     Node* next;
  9.     Node* prev;                                // указатели на структуру
  10. };
  11.  
  12. template<typename T>
  13. class DoubleList {                              // класс двунаправленный список
  14. private:
  15.     Node<T>* head;                             // указатель на начало списка
  16.     Node<T>* tail;                             // указатели на конец списка
  17. public:
  18.     DoubleList() : head(NULL), tail(NULL) {}    // инициализация указателей пустым значением
  19.     ~DoubleList();                             // деструктор
  20.     void add(T y);                             // добавление элемента
  21.     void showFromBegin();                      // вывод списка с начала
  22.     void showFromEnd();                        // вывод списка с конца
  23.     void getHead();                            // вывод головы
  24.     void getTail();                            // вывод хвоста
  25.     void addHead(T y);                         // добавить в начало списка
  26.     void delNum(int n);                        // удаление элемента по номеру
  27.     int size();                                // размер списка
  28.     int findNum(int n);                        // вернуть элемент, расположенный на n месте сверху
  29. };
  30.  
  31. template<typename T>
  32. DoubleList<T>::~DoubleList()
  33. {
  34.     while (head != NULL) {            // пока список не пуст
  35.         tail = head->next;            // последний элемент равен следующему за головой
  36.         delete head;                  // удаление головы
  37.         head = tail;                  // первым становится последний
  38.     }
  39. }
  40.  
  41. template<typename T>
  42. void DoubleList<T>::add(T y)
  43. {
  44.     Node<T>* temp = new Node<T>;      // выделение памяти для нового элемента
  45.     temp->next = NULL;                // за этим элементом нет других
  46.     temp->x = y;
  47.     if (head != NULL) {               // пока список не пуст
  48.         temp->prev = tail;            // следующий за temp элемент будет хвостом
  49.         tail->next = temp;            // элемент следующий за хвостом temp
  50.         tail = temp;                  // temp равен хвосту
  51.     }
  52.     else {
  53.         temp->prev = NULL;            // перед элементом пусто
  54.         head = tail = temp;           // голова равна хвосту и равна temp
  55.     }
  56. }
  57.  
  58. template<typename T>
  59. void DoubleList<T>::showFromBegin()
  60. {
  61.     Node<T>* temp = head;             // temp равен началу списка
  62.     while (temp != NULL) {            // пока список не пуст
  63.         cout << temp->x << " ";
  64.         temp = temp->next;            // перемещение на следующий
  65.     }
  66. }
  67.  
  68. template<typename T>
  69. void DoubleList<T>::showFromEnd()
  70. {
  71.     Node<T>* temp = tail;             // temp равен концу  списка
  72.     while (temp != NULL) {            // пока элементы есть
  73.         cout << temp->x << " ";
  74.         temp = temp->prev;            // перемещение на предыдущий
  75.     }
  76. }
  77.  
  78. template<typename T>
  79. void DoubleList<T>::getHead()
  80. {
  81.     if (head != NULL) {
  82.         cout << head->x << endl;
  83.     }
  84. }
  85.  
  86. template<typename T>
  87. void DoubleList<T>::getTail()
  88. {
  89.     if (tail != NULL) {
  90.         cout << tail->x << endl;
  91.     }
  92. }
  93.  
  94. template<typename T>
  95. void DoubleList<T>::addHead(T y)
  96. {
  97.     Node<T>* temp = new Node<T>;
  98.     temp->x = y;
  99.     if (temp != NULL) {
  100.         temp->next = head;
  101.         head = temp;
  102.     }
  103.     else {
  104.         head = tail = temp;
  105.     }
  106. }
  107.  
  108. template<typename T>
  109. void DoubleList<T>::delNum(int n) {
  110.     Node<T>* temp = head;
  111.     if (temp != NULL && n <= size()) {
  112.         for (int i = 0; i < n; i++) {
  113.             temp = temp->next;
  114.         }
  115.         if (temp == head) {
  116.             head = temp->next;
  117.         }
  118.         else {
  119.             temp->prev->next = temp->next;
  120.         }
  121.         delete temp;
  122.     }
  123. }
  124.  
  125. template<typename T>
  126. int DoubleList<T>::size() {
  127.     Node<T>* temp = head;
  128.     int counter = 0;
  129.     while (temp != NULL) {
  130.         temp = temp->next;
  131.         counter++;
  132.     }
  133.     return counter;
  134. }
  135.  
  136. template<typename T>
  137. int DoubleList<T>::findNum(int n) {
  138.     Node<T>* temp = head;
  139.     while (temp != NULL && n <= size()) {
  140.         for (int i = 0; i < n; i++) {
  141.             temp = temp->next;
  142.         }
  143.         return temp->x;
  144.     }
  145. }
  146.  
  147. //int main() {
  148. //  DoubleList <int> list;
  149. //  for (int i = 0; i < 5; i++) {
  150. //      list.add(i);
  151. //  }
  152. //  list.showFromBegin();
  153. //  cout << endl;
  154. //  list.showFromEnd();
  155. //  cout << endl;
  156. //  list.getHead();
  157. //  list.getTail();
  158. //  list.add(10);
  159. //  cout << endl;
  160. //  list.showFromBegin();
  161. //  list.addHead(7);
  162. //  cout << endl;
  163. //  list.showFromBegin();
  164. //  cout << endl;
  165. //  list.delNum(4);
  166. //  list.showFromBegin();
  167. //  return 0;
  168. //}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement