Neveles

Untitled

Jan 20th, 2020
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.82 KB | None | 0 0
  1. #include "List.h"
  2.  
  3. List::List()
  4. {
  5.     head_ = nullptr;
  6.     tail_ = nullptr;
  7. }
  8.  
  9. void List::clear()
  10. {
  11.     while (head_ != nullptr)
  12.     {
  13.         Node* temp = head_->next_;
  14.         delete head_;
  15.         head_ = temp;
  16.     }
  17.     tail_ = nullptr;
  18. }
  19.  
  20. List::~List()
  21. {
  22.     clear();
  23. }
  24.  
  25. List::List(List&& old) noexcept
  26. {
  27.     clear();
  28.     head_ = old.head_;
  29.     old.head_ = nullptr;
  30. }
  31.  
  32. void List::operator+=(int value)
  33. {
  34.     Node* newNode = new Node(value);
  35.     if (head_ == nullptr)
  36.     {
  37.         head_ = newNode;
  38.         tail_ = newNode;
  39.         minValue_ = value;
  40.     }
  41.     else {
  42.         tail_->next_ = newNode;
  43.         tail_ = newNode;
  44.         if (value < minValue_)
  45.             minValue_ = value;
  46.     }
  47. }
  48.  
  49. void List::operator+(int value)
  50. {
  51.     if (head_ == nullptr)
  52.     {
  53.         head_ = new Node;
  54.         head_->value_ = value;
  55.         head_->next_ = nullptr;
  56.     }
  57.     else
  58.     {
  59.         Node* newNode = new Node;
  60.         newNode->value_ = value;
  61.         newNode->next_ = head_;
  62.         head_ = newNode;
  63.     }
  64. }
  65.  
  66. std::ostream& operator<< (std::ostream& out, const List& list)
  67. {
  68.     List::Node* ptr = list.head_;
  69.     while (ptr != nullptr)
  70.     {
  71.         out << ptr->value_ << endl;
  72.         ptr = ptr->next_;
  73.     }
  74.     return out;
  75. }
  76.  
  77. void List::removeMinimal()
  78. {
  79.     //  удаляет из списка элемент с наименьшим значением (если их несколько, то удалить надо все)
  80.     Node* ptr = head_;
  81.     Node* prevPtr = nullptr;
  82.     int newMinimal = minValue_;
  83.     while (ptr != nullptr)
  84.     {
  85.         if (ptr->value_ == minValue_)
  86.         {
  87.             if (ptr == head_)
  88.                 head_ = head_->next_;
  89.             else
  90.                 prevPtr->next_ = ptr->next_;
  91.             if (ptr == tail_)
  92.                 tail_ = prevPtr;
  93.             Node* temp = ptr->next_;
  94.             delete ptr;
  95.             ptr = temp;
  96.         }
  97.         else
  98.         {
  99.             if (ptr->value_ < newMinimal || newMinimal == minValue_)
  100.                 newMinimal = ptr->value_;
  101.             prevPtr = ptr;
  102.             ptr = ptr->next_;
  103.         }
  104.     }
  105.     minValue_ = newMinimal;
  106. }
  107.  
  108. void List::removeRepeats()
  109. {
  110.     Node* iNode = head_;
  111.     while (iNode != nullptr)
  112.     {
  113.         Node* jNode = iNode->next_;
  114.         Node* prevNode = iNode;
  115.         while (jNode != nullptr)
  116.         {
  117.             if (iNode->value_ == jNode->value_) {
  118.                 prevNode->next_ = jNode->next_;
  119.                 Node* temp = jNode->next_;
  120.                 delete jNode;
  121.                 jNode = temp;
  122.             }
  123.             else
  124.             {
  125.                 prevNode = jNode;
  126.                 jNode = jNode->next_;
  127.             }
  128.         }
  129.         iNode = iNode->next_;
  130.     }
  131. }
  132.  
  133. void List::removeLess()
  134. {
  135.     Node* iNode = head_;
  136.     while (iNode != nullptr)
  137.     {
  138.         Node* jNode = iNode->next_;
  139.         Node* prevNode = iNode;
  140.         while (jNode != nullptr)
  141.         {
  142.             if (iNode->value_ > jNode->value_) {
  143.                 prevNode->next_ = jNode->next_;
  144.                 Node* temp = jNode->next_;
  145.                 delete jNode;
  146.                 jNode = temp;
  147.             }
  148.             else
  149.             {
  150.                 prevNode = jNode;
  151.                 jNode = jNode->next_;
  152.             }
  153.         }
  154.         iNode = iNode->next_;
  155.     }
  156. }
  157.  
  158. void List::reduce()
  159. {
  160.     Node* ptr = head_;
  161.     while (ptr != nullptr && ptr->next_ != nullptr)
  162.     {
  163.         ptr->value_ += ptr->next_->value_;
  164.         Node* temp = ptr->next_->next_;
  165.         delete ptr->next_;
  166.         ptr->next_ = temp;
  167.         ptr = temp;
  168.     }
  169. }
  170.  
  171. void List::insert(const List& other)
  172. {
  173.     Node* ptr = other.head_;
  174.     while (ptr != nullptr)
  175.     {
  176.         Node* newNode = new Node(ptr->value_);
  177.         if (head_ == nullptr)
  178.             head_ = tail_ = newNode;
  179.         else
  180.         {
  181.             tail_->next_ = newNode;
  182.             tail_ = newNode;
  183.         }
  184.         ptr = ptr->next_;
  185.     }
  186.     if (other.minValue_ < minValue_)
  187.         minValue_ = other.minValue_;
  188. }
  189.  
  190. void List::insertSorted(int value)
  191. {
  192.     if (head_ == nullptr)
  193.     {
  194.         Node* newNode = new Node(value);
  195.         head_ = newNode;
  196.         tail_ = newNode;
  197.         minValue_ = value;
  198.         return;
  199.     }
  200.     if (head_->value_ > value)
  201.     {
  202.         Node* newNode = new Node(value, head_);
  203.         head_ = newNode;
  204.         minValue_ = value;
  205.         return;
  206.     }
  207.     Node* ptr = head_;
  208.     while (ptr != nullptr)
  209.     {
  210.         if (ptr->next_ == nullptr)
  211.         {
  212.             Node* newNode = new Node(value);
  213.             ptr->next_ = newNode;
  214.             tail_ = newNode;
  215.             return;
  216.         }
  217.         else if (ptr->next_->value_ > value)
  218.         {
  219.             Node* newNode = new Node(value, ptr->next_);
  220.             ptr->next_ = newNode;
  221.             return;
  222.         }
  223.         else
  224.             ptr = ptr->next_;
  225.  
  226.     }
  227. }
  228.  
  229. void List::joinSorted(const List& other)
  230. {
  231.     Node* ptr = other.head_;
  232.     while (ptr != nullptr)
  233.     {
  234.         insertSorted(ptr->value_);
  235.         ptr = ptr->next_;
  236.     }
  237. }
Add Comment
Please, Sign In to add comment