Advertisement
RadioNurshat

Minimum of LinkedList

Mar 30th, 2021
457
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.00 KB | None | 0 0
  1. #include <string>
  2. #include <exception>
  3. #include <iostream>
  4. class LinkedList {
  5. private:
  6.     struct Element {
  7.         Element* next = nullptr;
  8.         Element* prev = nullptr;
  9.         int data = 0;
  10.         Element(int data) {
  11.             this->data = data;
  12.         }
  13.     };
  14.     Element* head = nullptr;
  15.     Element* tail = nullptr;
  16.     int length = 0;
  17.     Element* NodeAt(int n) {
  18.         if (n > this->length - 1 || n < 0) {
  19.             throw std::exception("Index is out of bounds");
  20.         }
  21.         else {
  22.             Element* pivot = this->head;
  23.             int c = 0;
  24.             while (c!=n) {
  25.                 pivot = pivot->next;
  26.                 c++;
  27.             }
  28.             return pivot;
  29.         }
  30.     }
  31.     void remove(Element* that) {
  32.         if (that == this->head) {
  33.             this->head = this->head->next;
  34.         }
  35.         else if(that == this->tail) {
  36.             this->tail->prev->next = nullptr;
  37.             this->tail = this->tail->prev;
  38.         }else{
  39.             std::cout << this->head << " " << that << " " << this->tail << std::endl;
  40.             that->prev->next = that->next;
  41.             that->next->prev = that->prev;
  42.         }
  43.         this->length--;
  44.     }
  45. public:
  46.     int size() {
  47.         return this->length;
  48.     }
  49.     int at(int n) {
  50.         return NodeAt(n)->data;
  51.     }
  52.     void push_back(int data) {
  53.         if (this->length == 0) {
  54.             this->head = new Element(data);
  55.             this->tail = this->head;
  56.  
  57.         }
  58.         else {
  59.             this->tail->next = new Element(data);
  60.             this->tail->next->prev = this->tail;
  61.             this->tail = this->tail->next;
  62.         }
  63.         this->length++;
  64.     }
  65.    
  66.     int operator[](int n) {
  67.         return at(n);
  68.     }
  69.     //Удаляет элемент по индексу
  70.     int remove_at(int n) {
  71.         if (n > this->length - 1 || n < 0) {
  72.             throw std::exception("Index is out of bounds");
  73.         }
  74.         else {
  75.             if (n == 0) {
  76.                 int result = this->head->data;
  77.                 this->head = this->head->next;
  78.                 return result;
  79.             }
  80.             else {
  81.                 Element* that = this->NodeAt(n);
  82.                 int result = that->data;
  83.                 that->prev->next = that->next;
  84.                 that->next->prev = that->prev;
  85.                 return result;
  86.             }
  87.         }
  88.         this->length--;
  89.     }
  90.     //Расширение стандартного интерфейса связного списка
  91.  
  92.     //Удаляет элемент по значению
  93.     void remove_by(int a) {
  94.         Element* pivot = this->head;
  95.         while(pivot != nullptr) {
  96.             if (pivot->data == a) {
  97.                 Element* deletable = pivot;
  98.                 pivot = pivot->next;
  99.                 this->remove(deletable);
  100.                
  101.             }
  102.             else {
  103.                 pivot = pivot->next;
  104.             }
  105.         }
  106.         this->length--;
  107.     }
  108.     //Минимальный элемент списка
  109.     int min() {
  110.         int minima = INFINITY;
  111.         Element* pivot = this->head;
  112.         while (pivot != nullptr) {
  113.             if (pivot->data < minima) {
  114.                 minima = pivot->data;
  115.             }
  116.         }
  117.         return minima;
  118.     }
  119.     std::string ToString() {
  120.         std::string s;
  121.         Element* pivot = this->head;
  122.         while (pivot != nullptr) {
  123.             s += std::to_string(pivot->data) + " ";
  124.             pivot = pivot->next;
  125.         }
  126.         return s;
  127.     }
  128. };
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135. int main()
  136. {
  137.     LinkedList list;
  138.     int n = 0;
  139.     std::cin >> n;
  140.     for (int i = 0; i < n; i++) {
  141.         int a;
  142.         std::cin >> a;
  143.         list.push_back(a);
  144.     }
  145.     int min = list.min();
  146.     list.remove_by(min);
  147.     std::cout << list.ToString() << std::endl;
  148. }
  149.  
  150.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement