Advertisement
cacodemon665

Лаба 15 Вариант 6

Apr 11th, 2019
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.91 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct LinkedListNode
  6. {
  7.     int value;
  8.     LinkedListNode* prev, * next;
  9. };
  10.  
  11. struct LinkedList
  12. {
  13.     LinkedListNode* first, * last;
  14. };
  15.  
  16. void insertBefore(LinkedList* list, LinkedListNode* node, LinkedListNode* new_node)
  17. {
  18.     if (node == list->first)
  19.     {
  20.         list->first = new_node;
  21.     }
  22.  
  23.     new_node->prev = node->prev;
  24.     new_node->next = node;
  25.  
  26.     if (node->prev)
  27.         node->prev->next = new_node;
  28.  
  29.     node->prev = new_node;
  30. }
  31.  
  32. void insertAfter(LinkedList* list, LinkedListNode* node, LinkedListNode* new_node)
  33. {
  34.     if (node == list->last)
  35.     {
  36.         list->last = new_node;
  37.     }
  38.  
  39.     new_node->prev = node;
  40.     new_node->next = node->next;
  41.  
  42.     if (node->next)
  43.         node->next->prev = new_node;
  44.  
  45.     node->next = new_node;
  46. }
  47.  
  48. void addFirst(LinkedList* list, int value)
  49. {
  50.     LinkedListNode* new_node = new LinkedListNode;
  51.     new_node->value = value;
  52.     new_node->prev = nullptr;
  53.     new_node->next = nullptr;
  54.  
  55.     if (!list->first || !list->last)
  56.     {
  57.         list->first = list->last = new_node;
  58.         return;
  59.     }
  60.     else
  61.     {
  62.         insertBefore(list, list->first, new_node);
  63.     }
  64. }
  65.  
  66. void addLast(LinkedList* list, int value)
  67. {
  68.     LinkedListNode* new_node = new LinkedListNode;
  69.     new_node->value = value;
  70.     new_node->prev = nullptr;
  71.     new_node->next = nullptr;
  72.  
  73.     if (!list->first || !list->last)
  74.     {
  75.         list->first = list->last = new_node;
  76.         return;
  77.     }
  78.     else
  79.     {
  80.         insertAfter(list, list->last, new_node);
  81.     }
  82. }
  83.  
  84. void remove(LinkedList* list, LinkedListNode* node)
  85. {
  86.     if (node == nullptr)
  87.     {
  88.         cerr << "node is null" << endl;
  89.         return;
  90.     }
  91.  
  92.     if (list->first != list->last)
  93.     {
  94.         if (node == list->first)
  95.         {
  96.             list->first = node->next;
  97.             node->next->prev = nullptr;
  98.         }
  99.         else if (node == list->last)
  100.         {
  101.             list->last = node->prev;
  102.             node->prev->next = nullptr;
  103.         }
  104.         else
  105.         {
  106.             node->next->prev = node->prev;
  107.             node->prev->next = node->next;
  108.         }
  109.     }
  110.  
  111.     delete node;
  112. }
  113.  
  114. void removeNegativeValues(LinkedList* list)
  115. {
  116.     LinkedListNode* current = list->first;
  117.  
  118.     while (current)
  119.     {
  120.         LinkedListNode* next = current->next;
  121.  
  122.         if (current->value < 0)
  123.         {
  124.             remove(list, current);
  125.         }
  126.  
  127.         current = next;
  128.     }
  129. }
  130.  
  131. void deleteAll(LinkedList* list)
  132. {
  133.     LinkedListNode* current = list->first;
  134.  
  135.     while (current)
  136.     {
  137.         LinkedListNode* node_to_del = current;
  138.         current = current->next;
  139.  
  140.         delete node_to_del;
  141.     }
  142. }
  143.  
  144. void print(LinkedListNode* first)
  145. {
  146.     if (first)
  147.     {
  148.         cout << first->value << " ";
  149.         print(first->next);
  150.     }
  151.     else
  152.     {
  153.         cout << endl;
  154.     }
  155. }
  156.  
  157. void merge(LinkedList* result, LinkedList* left, LinkedList* right)
  158. {
  159.     LinkedListNode* l_current = left->first,
  160.         * r_current = right->first;
  161.  
  162.     // merge to left list
  163.     result->first = left->first;
  164.     result->last = left->last;
  165.  
  166.     while (l_current && r_current)
  167.     {
  168.         if (l_current->value <= r_current->value)
  169.         {
  170.             l_current = l_current->next;
  171.         }
  172.         else
  173.         {
  174.             LinkedListNode* next = r_current->next;
  175.             insertBefore(result, l_current, r_current);
  176.             r_current = next;
  177.         }
  178.     }
  179.  
  180.     if (r_current)
  181.     {
  182.         result->last->next = r_current;
  183.         r_current->prev = result->last;
  184.  
  185.         result->last = right->last;
  186.     }
  187.  
  188. }
  189.  
  190. void split(LinkedList* list, LinkedList* left, LinkedList* right)
  191. {
  192.     left->first = left->last = list->first;
  193.  
  194.     if (!left->first->next)
  195.         return;
  196.  
  197.     right->first = right->last = list->first->next;
  198.  
  199.  
  200.     LinkedListNode* current = list->first->next->next;
  201.  
  202.     left->first->next = nullptr;
  203.     left->first->prev = nullptr;
  204.     right->first->next = nullptr;
  205.     right->first->prev = nullptr;
  206.  
  207.     LinkedListNode* next;
  208.  
  209.     while (current)
  210.     {
  211.         next = current->next;
  212.         insertAfter(left, left->last, current);
  213.         current = next;
  214.  
  215.         if (current)
  216.         {
  217.             next = current->next;
  218.             insertAfter(right, right->last, current);
  219.             current = next;
  220.         }
  221.     }
  222. }
  223.  
  224. void mergeSort(LinkedList* list)
  225. {
  226.     if (list->first == list->last)
  227.         return;
  228.  
  229.     LinkedList * left = new LinkedList, *right = new LinkedList;
  230.  
  231.     split(list, left, right);
  232.     mergeSort(left);
  233.     mergeSort(right);
  234.     merge(list, left, right);
  235. }
  236.  
  237. void find(LinkedList * list, int value)
  238. {
  239.     LinkedListNode* current = list->first;
  240.     int cnt = 0; // !
  241.  
  242.     while (current && current->value != value)
  243.     {
  244.         current = current->next;
  245.         cnt++;
  246.     }
  247.  
  248.     if (current)
  249.     {
  250.         cout << cnt << endl;
  251.     }
  252.     else
  253.     {
  254.         cout << "Not found!" << endl;
  255.     }
  256. }
  257.  
  258. void removeLast(LinkedList * list)
  259. {
  260.     LinkedListNode* current = list->first;
  261.  
  262.     while (current->next->next)
  263.     {
  264.         current = current->next;
  265.     }
  266.  
  267.     list->last = current; //
  268.     delete current->next;
  269.     current->next = nullptr;
  270. }
  271.  
  272. int main()
  273. {
  274.     LinkedList* list = new LinkedList;
  275.     list->first = nullptr;
  276.     list->last = nullptr;
  277.  
  278.     int n;
  279.     cin >> n;
  280.  
  281.     for (int i = 0; i < n; i++)
  282.     {
  283.         int temp;
  284.         cin >> temp;
  285.  
  286.         addLast(list, temp);
  287.     }
  288.  
  289.     removeNegativeValues(list);
  290.     print(list->first);
  291.     mergeSort(list);
  292.     print(list->first);
  293.     find(list, 6);
  294.  
  295.     removeLast(list);
  296.     removeLast(list);
  297.     print(list->first);
  298.  
  299.     deleteAll(list);
  300. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement