Advertisement
Guest User

Untitled

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