Advertisement
vencinachev

LinkedList-Usten

Jun 1st, 2021
1,028
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.95 KB | None | 0 0
  1. #include <iostream>
  2. #include <stack>
  3.  
  4. using namespace std;
  5.  
  6. struct Node
  7. {
  8.     int data;
  9.     Node* next;
  10. };
  11.  
  12. bool contains(Node* head, int el);
  13. int sizell(Node* head);
  14. void printList(Node* head);
  15. void DeleteNth(Node*& head, unsigned index);
  16. void MergeSort(Node*& head);
  17. void PushBack(Node*& head, int element);
  18. int GetNth(Node* head, unsigned index); // 1
  19. void InsertNth(Node*& head, unsigned index, int element); // 2
  20. void DeleteList(Node*& head);   // 3
  21. Node* CopyList(Node*& head);  // 4
  22. void Append(Node*& a, Node*& b);  // 5
  23. void FrontBackSplit(Node* head, Node*& front, Node*& back);  // 6
  24. void RemoveDublicates(Node*& head);  // 7
  25. void MoveNode(Node*& a, Node*& b);  // 8
  26. void AlternatingSplit(Node* head, Node*& a, Node*& b);  // 9
  27. void AlternatingSplit2(Node* head, Node*& a, Node*& b);  // 10
  28. Node* ShuffleMerge(Node* a, Node* b);  // 11
  29. void Shuffle(Node*& head);   // 12
  30. Node* SortedMerge(Node* a, Node* b); // 13
  31. Node* SortedUnion(Node* a, Node* b);  // 14
  32. Node* SortedIntersect(Node* a, Node* b);  // 15
  33. Node* SortedDifference(Node* a, Node* b); // 16
  34. void Reverse(Node*& head);   // 17
  35. void ReverseWithStack(Node*& head);  // 18
  36.  
  37. int main()
  38. {
  39.     Node* l1 = nullptr;
  40.     Node* l2 = nullptr;
  41.     /*InsertNth(l1, 0, 1);
  42.     InsertNth(l1, 1, 10);
  43.     InsertNth(l1, 2, 25);
  44.     InsertNth(l1, 3, 45);
  45.     InsertNth(l1, 4, 55);
  46.     InsertNth(l1, 5, 65);
  47.     InsertNth(l1, 6, 75);
  48.     InsertNth(l1, 7, 80);
  49.     InsertNth(l2, 0, 10);
  50.     InsertNth(l2, 1, 20);
  51.     InsertNth(l2, 2, 30);
  52.     InsertNth(l2, 3, 40);
  53.     InsertNth(l2, 4, 50);
  54.     InsertNth(l2, 5, 60);
  55.     InsertNth(l2, 6, 70);
  56.     InsertNth(l2, 7, 80);*/
  57.  
  58.     InsertNth(l1, 0, 1);
  59.     InsertNth(l1, 1, 2);
  60.     InsertNth(l1, 2, 4);
  61.     InsertNth(l1, 3, 4);
  62.     InsertNth(l1, 4, 5);
  63.     InsertNth(l1, 5, 6);
  64.     InsertNth(l1, 6, 7);
  65.     InsertNth(l1, 7, 8);
  66.     InsertNth(l2, 0, 2);
  67.     InsertNth(l2, 1, 4);
  68.     InsertNth(l2, 2, 7);
  69.     InsertNth(l2, 3, 40);
  70.     InsertNth(l2, 4, 50);
  71.     InsertNth(l2, 5, 60);
  72.     InsertNth(l2, 6, 70);
  73.     InsertNth(l2, 7, 80);
  74.  
  75.  
  76.     printList(l1);
  77.     ReverseWithStack(l1);
  78.     printList(l1);
  79.  
  80.     return 0;
  81. }
  82.  
  83. int sizell(Node* head)
  84. {
  85.     int cnt = 0;
  86.     Node* current = head;
  87.     while (current != nullptr)
  88.     {
  89.         cnt++;
  90.         current = current->next;
  91.     }
  92.     return cnt;
  93. }
  94.  
  95. bool contains(Node* head, int el)
  96. {
  97.     Node* current = head;
  98.     while(current != nullptr)
  99.     {
  100.         if (current->data == el)
  101.         {
  102.             return true;
  103.         }
  104.         current = current->next;
  105.     }
  106.     return false;
  107. }
  108.  
  109. int GetNth(Node* head, unsigned index)
  110. {
  111.     if (sizell(head) < index)
  112.     {
  113.         throw "Index out of range exception!";
  114.     }
  115.     Node* current = head;
  116.     for (int i = 0; i < index; i++)
  117.     {
  118.         current = current->next;
  119.     }
  120.     return current->data;
  121. }
  122.  
  123. void InsertNth(Node*& head, unsigned index, int element)
  124. {
  125.     Node* n = new Node();
  126.     n->data = element;
  127.     if (head == nullptr || index == 0)
  128.     {
  129.         n->next = head;
  130.         head = n;
  131.     }
  132.     else
  133.     {
  134.         Node* current = head;
  135.         for (int i = 1; i < index && current->next != nullptr; i++)
  136.         {
  137.              current = current->next;
  138.         }
  139.         n->next = current->next;
  140.         current->next = n;
  141.     }
  142. }
  143.  
  144. void DeleteNth(Node*& head, unsigned index)
  145. {
  146.     if (index >= sizell(head))
  147.     {
  148.         throw "Index out of range exception!";
  149.     }
  150.     if (index == 0)
  151.     {
  152.         Node* todelete = head;
  153.         head = head->next;
  154.         delete todelete;
  155.         return;
  156.     }
  157.     Node* current = head;
  158.     Node* prev;
  159.     for (int i = 0; i < index; i++)
  160.     {
  161.         prev = current;
  162.         current = current->next;
  163.     }
  164.     prev->next = current->next;
  165.     delete current;
  166. }
  167.  
  168. void DeleteList(Node*& head)
  169. {
  170.     Node* current = head;
  171.     Node* todelete;
  172.     while (current != nullptr)
  173.     {
  174.         todelete = current;
  175.         current = current->next;
  176.         delete todelete;
  177.     }
  178.     head = nullptr;
  179. }
  180.  
  181. void printList(Node* head)
  182. {
  183.     Node* current = head;
  184.     while (current != nullptr)
  185.     {
  186.         cout << current->data << " ";
  187.         current = current->next;
  188.     }
  189.     cout << endl;
  190. }
  191.  
  192. Node* CopyList(Node*& head)
  193. {
  194.     Node* copyl = nullptr;
  195.     for (int i = 0; i < sizell(head); i++)
  196.     {
  197.         InsertNth(copyl, i, GetNth(head, i));
  198.     }
  199.     return copyl;
  200. }
  201.  
  202. void Append(Node*& a, Node*& b)
  203. {
  204.     int sizea = sizell(a);
  205.     int sizeb = sizell(b);
  206.     for (int i = 0; i < sizeb; i++)
  207.     {
  208.         InsertNth(a, sizea+i, GetNth(b, i));
  209.     }
  210.     b = nullptr;
  211. }
  212.  
  213. Node* SortedMerge(Node* a, Node* b)
  214. {
  215.     Node dummy;
  216.     dummy.next = nullptr;
  217.     Node* tail = &dummy;
  218.  
  219.     while (true)
  220.     {
  221.         if (a == nullptr)
  222.         {
  223.             tail->next = b;
  224.             break;
  225.         }
  226.         if (b == nullptr)
  227.         {
  228.             tail->next = a;
  229.             break;
  230.         }
  231.         if (a->data < b->data)
  232.         {
  233.             tail->next = a;
  234.             tail = a;
  235.             a=a->next;
  236.         }
  237.         else
  238.         {
  239.             tail->next = b;
  240.             tail = b;
  241.             b=b->next;
  242.         }
  243.     }
  244.     return dummy.next;
  245. }
  246.  
  247. void FrontBackSplit(Node* head, Node*& front, Node*& back)
  248. {
  249.     if (head == nullptr)
  250.     {
  251.         front = nullptr;
  252.         back = nullptr;
  253.     }
  254.     else
  255.     {
  256.         Node* slowptr = head;
  257.         Node *fastptr = head->next;
  258.         while (fastptr != nullptr)
  259.         {
  260.             fastptr = fastptr->next;
  261.             if (fastptr != nullptr)
  262.             {
  263.                 fastptr = fastptr->next;
  264.                 slowptr = slowptr->next;
  265.             }
  266.         }
  267.         back = slowptr->next;
  268.         slowptr->next = nullptr;
  269.         front = head;
  270.     }
  271. }
  272.  
  273. void RemoveDublicates(Node*& head)
  274. {
  275.     if (head == nullptr)
  276.     {
  277.         return;
  278.     }
  279.     Node *current = head;
  280.     while (current->next != nullptr)
  281.     {
  282.         if (current->data == current->next->data)
  283.         {
  284.             Node* todelete = current->next;
  285.             current->next = current->next->next;
  286.             delete todelete;
  287.         }
  288.         else
  289.         {
  290.             current = current->next;
  291.         }
  292.     }
  293. }
  294.  
  295. void MergeSort(Node*& head)
  296. {
  297.     if (head == nullptr || head->next == nullptr)
  298.     {
  299.         return;
  300.     }
  301.     Node* front;
  302.     Node* back;
  303.     FrontBackSplit(head, front, back);
  304.     MergeSort(front);
  305.     MergeSort(back);
  306.     head = SortedMerge(front, back);
  307. }
  308.  
  309. void MoveNode(Node*& a, Node*& b)
  310. {
  311.     if (b == nullptr)
  312.     {
  313.         return;
  314.     }
  315.     Node* temp = b->next;
  316.     b->next = a;
  317.     a = b;
  318.     b = temp;
  319. }
  320.  
  321. void AlternatingSplit(Node* head, Node*& a, Node*& b)
  322. {
  323.     a = nullptr;
  324.     b = nullptr;
  325.     if (head == nullptr)
  326.     {
  327.         return;
  328.     }
  329.     while (true)
  330.     {
  331.         if (head != nullptr)
  332.         {
  333.            MoveNode(a, head);
  334.         }
  335.         else
  336.         {
  337.             break;
  338.         }
  339.         if (head != nullptr)
  340.         {
  341.            MoveNode(b, head);
  342.         }
  343.         else
  344.         {
  345.             break;
  346.         }
  347.     }
  348. }
  349.  
  350. void AlternatingSplit2(Node* head, Node*& a, Node*& b)
  351. {
  352.     a = nullptr;
  353.     b = nullptr;
  354.     if (head == nullptr)
  355.     {
  356.         return;
  357.     }
  358.     int i = 0;
  359.     Node* current = head;
  360.     while (true)
  361.     {
  362.         if (current != nullptr)
  363.         {
  364.             InsertNth(a, i, current->data);
  365.         }
  366.         else
  367.         {
  368.             break;
  369.         }
  370.         current = current->next;
  371.         if (current != nullptr)
  372.         {
  373.             InsertNth(b, i, current->data);
  374.         }
  375.         else
  376.         {
  377.             break;
  378.         }
  379.         current = current->next;
  380.         i++;
  381.     }
  382. }
  383.  
  384. void PushBack(Node*& head, int element)
  385. {
  386.     InsertNth(head, sizell(head), element);
  387. }
  388.  
  389. Node* ShuffleMerge(Node* a, Node* b)
  390. {
  391.     Node* result = nullptr;
  392.     Node* currentA = a;
  393.     Node* currentB = b;
  394.     while (true)
  395.     {
  396.         if (currentA != nullptr)
  397.         {
  398.             PushBack(result, currentA->data);
  399.             currentA = currentA->next;
  400.         }
  401.         if (currentB != nullptr)
  402.         {
  403.             PushBack(result, currentB->data);
  404.             currentB = currentB->next;
  405.         }
  406.         if (currentA == nullptr && currentB == nullptr)
  407.         {
  408.             break;
  409.         }
  410.     }
  411.     return result;
  412. }
  413.  
  414. void Shuffle(Node*& head)
  415. {
  416.     Node* a;
  417.     Node* b;
  418.     FrontBackSplit(head, a, b);
  419.     head = ShuffleMerge(a, b);
  420. }
  421.  
  422. Node* SortedUnion(Node* a, Node* b)
  423. {
  424.     Node* unionl = SortedMerge(a, b);
  425.     RemoveDublicates(unionl);
  426.     return unionl;
  427. }
  428.  
  429. Node* SortedIntersectSortedUnion(Node* a, Node* b)
  430. {
  431.     Node* intersect = nullptr;
  432.     Node* current = a;
  433.     while (current != nullptr)
  434.     {
  435.         if (contains(b, current->data) && !contains(intersect, current->data))
  436.         {
  437.             PushBack(intersect, current->data);
  438.         }
  439.         current = current->next;
  440.     }
  441.     return intersect;
  442. }
  443.  
  444. Node* SortedDifference(Node* a, Node* b)
  445. {
  446.     Node* diff = nullptr;
  447.     Node* current = a;
  448.     while (current != nullptr)
  449.     {
  450.         if (!contains(b, current->data) && !contains(diff, current->data))
  451.         {
  452.             PushBack(diff, current->data);
  453.         }
  454.         current = current->next;
  455.     }
  456.     return diff;
  457. }
  458.  
  459. void Reverse(Node*& head)
  460. {
  461.     Node* previous = nullptr;
  462.     Node* current = head;
  463.     Node* next;
  464.     while (current != nullptr)
  465.     {
  466.         next = current->next;
  467.         current->next = previous;
  468.         previous = current;
  469.         current = next;
  470.     }
  471.     head = previous;
  472. }
  473.  
  474. void ReverseWithStack(Node*& head)
  475. {
  476.     stack<int> st;
  477.     Node* current = head;
  478.     while (current != nullptr)
  479.     {
  480.         st.push(current->data);
  481.         current = current->next;
  482.     }
  483.     current = head;
  484.     while (current != nullptr)
  485.     {
  486.         current->data = st.top();
  487.         st.pop();
  488.         current = current->next;
  489.     }
  490. }
  491.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement