Advertisement
RobertDeMilo

самый лучший

Dec 8th, 2023
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.90 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdlib.h>
  3.  
  4. using namespace std;
  5.  
  6. struct Node
  7. {
  8.     int value;
  9.     Node* next;
  10. };
  11.  
  12.  
  13. Node* addnode(int value, Node* next);
  14. Node* mergesort(Node* head);
  15. Node* merge(Node* head_one, Node* head_two);
  16.  
  17.  
  18.  
  19. Node* addnode(int number, Node* next)
  20. {
  21.     Node* tnode = new Node;
  22.     tnode->value = number;
  23.     tnode->next = next;
  24.  
  25.     return tnode;
  26. }
  27.  
  28. Node* merge(Node* head_one, Node* head_two)
  29. {
  30.     Node* head_three = nullptr;
  31.  
  32.     if (head_one == nullptr)
  33.     {
  34.         return head_two;
  35.     }
  36.     if (head_two == nullptr)
  37.     {
  38.         return head_one;
  39.     }
  40.     if (head_one->value < head_two->value)
  41.     {
  42.         head_three = head_one;
  43.         head_three->next = merge(head_one->next, head_two);
  44.     }
  45.     else
  46.     {
  47.         head_three = head_two;
  48.         head_three->next = merge(head_one, head_two->next);
  49.     }
  50.  
  51.     return head_three;
  52. }
  53.  
  54. Node* mergesort(Node* head)
  55. {
  56.     Node* head_one;
  57.     Node* head_two;
  58.  
  59.     if ((head == nullptr) || (head->next == nullptr))
  60.     {
  61.         return head;
  62.     }
  63.  
  64.     head_one = head;
  65.     head_two = head->next;
  66.  
  67.     while ((head_two != nullptr) && (head_two->next != nullptr))
  68.     {
  69.         head = head->next;
  70.         head_two = head_two->next->next;
  71.     }
  72.  
  73.     head_two = head->next;
  74.     head->next = nullptr;
  75.  
  76.     return merge(mergesort(head_one), mergesort(head_two));
  77. }
  78.  
  79. Node* Reverse(Node * head)
  80. {
  81.     Node* temp = head; // текущий узел
  82.     Node* prev = nullptr;    // предыдущий узел
  83.     Node* nexto;             // следующий узел
  84.  
  85.     while (temp != nullptr)
  86.     {
  87.         nexto = temp->next; // 250 (запоминаем значение слеующего узла) для того чтобы разрушить связь
  88.  
  89.         if (nexto == nullptr)
  90.         {
  91.             head = temp;
  92.         }
  93.  
  94.         temp->next = prev; //разрушали связь между узлами, (разворачиваем узлы) где было 250 сейчас nullptr
  95.  
  96.         prev = temp; // на след. итерации пред узлом будет текущий
  97.  
  98.         temp = nexto; // переходим на след итерацию
  99.  
  100.     }
  101.     return head;
  102.     // head_.next = prev; или
  103. }
  104.  
  105. int main()
  106. {
  107.     Node* head;
  108.     Node* current;
  109.     Node* next;
  110.  
  111.    
  112.     int test[] = { 1,3,2,7,6 };
  113.  
  114.     head = nullptr;
  115.  
  116.    
  117.     for (int i = 0; i < 5; ++i)
  118.     {
  119.         head = addnode(test[i], head);
  120.     }
  121.  
  122.     head = mergesort(head);
  123.  
  124.     head = Reverse(head);
  125.  
  126.     head = mergesort(head);
  127.  
  128.     int i = 0;
  129.  
  130.     for (current = head; current != nullptr; current = current->next)
  131.     {
  132.         cout << test[i++] << " " << current->value << endl;
  133.     }
  134.  
  135.  
  136.     for (current = head; current != nullptr; current = next)
  137.     {
  138.        
  139.         next = current->next;
  140.         delete current;
  141.     }
  142.  
  143.     return 0;
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement