tranerius

27. Двусвязный список

Feb 16th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.45 KB | None | 0 0
  1. template<typename T>
  2. class line {
  3.  
  4.     template<typename T>
  5.     class element {
  6.     public:
  7.         T data;
  8.         element<T> *next_element, *previous_element;
  9.         element(T data = T(), element<T> *next_element = nullptr, element<T> *previous_element = nullptr) {
  10.             this->data = data;
  11.             this->next_element = next_element;
  12.             this->previous_element = previous_element;
  13.         }
  14.     };
  15.  
  16.     element<T> *first_element, *last_element;
  17.     unsigned int Size;
  18. public:
  19.  
  20.     line() {
  21.         Size = 0;
  22.         first_element = nullptr;
  23.         last_element = nullptr;
  24.     }
  25.  
  26.     void push_back(T data) {
  27.         if (first_element == nullptr) {
  28.             first_element = new element<T>(data);
  29.         }
  30.         else if (first_element != nullptr && last_element == nullptr) {
  31.             last_element = new element<T>(data, nullptr, first_element);
  32.             first_element->next_element = last_element;
  33.         }
  34.         else {
  35.             last_element->next_element = new element<T>(data, nullptr, last_element);
  36.             last_element = last_element->next_element;
  37.         }
  38.         Size++;
  39.     }
  40.  
  41.     void pop_back() {
  42.         if (Size != 0) {
  43.             if (Size != 1) {
  44.                 element<T> *temp_adress;
  45.                 temp_adress = last_element->previous_element;
  46.                 delete last_element;
  47.                 last_element = temp_adress;
  48.                 temp_adress->next_element = nullptr;
  49.             }
  50.             else {
  51.                 delete first_element;
  52.                 first_element = nullptr;
  53.             }
  54.             Size--;
  55.         }
  56.     }
  57.  
  58.     int size() { return Size; }
  59.  
  60.     T& operator [](int index) {
  61.         if (Size != 0) {
  62.             unsigned int Count = 0;
  63.             element<T> *temp_adress;
  64.             if (index >= Size / 2 && index > 1) {
  65.                 temp_adress = last_element;
  66.                 while (Count != Size - index - 1) {
  67.                     temp_adress = temp_adress->previous_element;
  68.                     Count++;
  69.                 }
  70.             }
  71.             else {
  72.                 temp_adress = first_element;
  73.                 while (Count != index) {
  74.                     if (temp_adress->next_element == nullptr) {
  75.                         break;
  76.                     }
  77.                     temp_adress = temp_adress->next_element;
  78.                     Count++;
  79.                 }
  80.             }
  81.             return temp_adress->data;
  82.         }
  83.         else { return index; }
  84.     }
  85.  
  86.     void push_front(T data) {
  87.         first_element = new element<T>(data, first_element, nullptr);
  88.         first_element->next_element->previous_element = first_element;
  89.         if (last_element == nullptr) {
  90.             last_element = first_element->next_element;
  91.         }
  92.         Size++;
  93.     }
  94.  
  95.     void pop_front() {
  96.         if (Size != 0) {
  97.             element<T> *temp_adress;
  98.             if (last_element != nullptr) {
  99.                 first_element->next_element->previous_element = nullptr;
  100.                 temp_adress = first_element;
  101.                 if (last_element == first_element->next_element) {
  102.                     last_element = nullptr;
  103.                 }
  104.                 first_element = first_element->next_element;
  105.                 delete temp_adress;
  106.             }
  107.             else {
  108.                 delete first_element;
  109.                 first_element == nullptr;
  110.             }
  111.             Size--;
  112.         }
  113.     }
  114.  
  115.     void clear() {
  116.         while (Size != 0) {
  117.             pop_front();
  118.         }
  119.     }
  120.  
  121.     void insert(T data, int index) {
  122.         if (index <= Size) {
  123.             if (index == 0) {
  124.                 push_front(data);
  125.             }
  126.             else if (index == Size) {
  127.                 push_back(data);
  128.             }
  129.             else {
  130.                 unsigned int Count = 0;
  131.                 element<T> *temp_adress;
  132.                 if (index >= Size / 2 && index > 1) {
  133.                     temp_adress = last_element;
  134.                     while (Count != Size - index - 1) {
  135.                         temp_adress = temp_adress->previous_element;
  136.                         Count++;
  137.                     }
  138.                 }
  139.                 else {
  140.                     temp_adress = first_element;
  141.                     while (Count != index) {
  142.                         if (temp_adress->next_element == nullptr) {
  143.                             break;
  144.                         }
  145.                         temp_adress = temp_adress->next_element;
  146.                         Count++;
  147.                     }
  148.                 }
  149.                 temp_adress = new element<T>(data, temp_adress, temp_adress->previous_element);
  150.                 temp_adress->previous_element->next_element = temp_adress->next_element->previous_element = temp_adress;
  151.                 Size++;
  152.             }
  153.         }
  154.     }
  155.  
  156.     void removeAt(int index) {
  157.         if (index < Size) {
  158.             if (index == 0) {
  159.                 pop_front();
  160.             }
  161.             else if (index == Size - 1) {
  162.                 pop_back();
  163.             }
  164.             else {
  165.                 unsigned int Count = 0;
  166.                 element<T> *temp_adress;
  167.                 if (index >= Size / 2 && index > 1) {
  168.                     temp_adress = last_element;
  169.                     while (Count != Size - index - 1) {
  170.                         temp_adress = temp_adress->previous_element;
  171.                         Count++;
  172.                     }
  173.                 }
  174.                 else {
  175.                     temp_adress = first_element;
  176.                     while (Count != index) {
  177.                         if (temp_adress->next_element == nullptr) {
  178.                             break;
  179.                         }
  180.                         temp_adress = temp_adress->next_element;
  181.                         Count++;
  182.                     }
  183.                 }
  184.                 temp_adress->previous_element->next_element = temp_adress->next_element;
  185.                 temp_adress->next_element->previous_element = temp_adress->previous_element;
  186.                 delete temp_adress;
  187.                 Size--;
  188.             }
  189.         }
  190.     }
  191.  
  192.     ~line() {
  193.         clear();
  194.     }
  195. };
Advertisement
Add Comment
Please, Sign In to add comment