Idanref

Untitled

May 3rd, 2021
447
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4.  
  5. typedef struct Node4
  6. {
  7.     int value;
  8.     struct Node4* next;
  9. } node4;
  10.  
  11. node4* create_node4(int data)
  12. {
  13.     node4* temp = (node4*)malloc(sizeof(node4));
  14.  
  15.     temp->value = data;
  16.     temp->next = NULL;
  17.  
  18.     return temp;
  19. }
  20.  
  21. void insert(node4** head, int value)
  22. {
  23.     node4* link = create_node4(value);
  24.  
  25.     if (*head == NULL)
  26.     {
  27.         *head = link;
  28.         return;
  29.     }
  30.  
  31.     node4* temp = *head;
  32.  
  33.     while (temp->next != NULL)
  34.     {
  35.         temp = temp->next;
  36.     }
  37.  
  38.     temp->next = link;
  39. }
  40.  
  41. void print_list(node4* head)
  42. {
  43.     node4* temp = head;
  44.  
  45.     if (head == NULL)
  46.     {
  47.         printf("List is empty.\n");
  48.         return;
  49.     }
  50.  
  51.     while (temp != NULL)
  52.     {
  53.         printf("%d-> ", temp->value);
  54.         temp = temp->next;
  55.     }
  56.     printf("\n");
  57. }
  58.  
  59. void delete_after(node4* temp)
  60. {
  61.     node4* delete_node4 = temp->next;
  62.     temp->next = temp->next->next;
  63.     free(delete_node4);
  64. }
  65.  
  66. void delete_head(node4** head)
  67. {
  68.     if ((*head) && (*head)->next == NULL)
  69.     {
  70.         free(*head);
  71.         return;
  72.     }
  73.  
  74.     node4* delete_node4 = *head;
  75.     *head = (*head)->next;
  76.     free(delete_node4);
  77. }
  78.  
  79. node4* createList(node4** head)
  80. {
  81.     node4* temp = *head;
  82.     node4* head2 = NULL;
  83.     node4* new_node4;
  84.  
  85.     if (*head == NULL) // no items
  86.     {
  87.         return head2;
  88.     }
  89.  
  90.     if (*head && (*head)->next == NULL) // 1 item in the list
  91.     {
  92.         insert(&head2, (*head)->value);
  93.         delete_head(head);
  94.         return head2;
  95.     }
  96.  
  97.     if (temp->value > temp->next->value) // first item bigger
  98.     {
  99.         insert(&head2, (*head)->value);
  100.         delete_head(head);
  101.         temp = *head;
  102.     }
  103.  
  104.     while (temp->next->next != NULL && temp->next != NULL)
  105.     {
  106.         if (temp->value < temp->next->value && temp->next->value > temp->next->next->value)
  107.         {
  108.             insert(&head2, temp->next->value);
  109.             delete_after(temp);
  110.         }
  111.  
  112.         if(temp->next)
  113.             temp = temp->next;
  114.     }
  115.  
  116.     if (temp->next->value > temp->value) // last item
  117.     {
  118.         insert(&head2, temp->next->value);
  119.         delete_after(temp);
  120.     }
  121.  
  122.     return head2;
  123. }
  124.  
  125. node4* createList2(node4** head) // second without memory allocation and free
  126. {
  127.     node4* temp = *head;
  128.     node4* head2 = NULL;
  129.     node4* new_node4;
  130.     node4* temp2;
  131.  
  132.  
  133.     if (*head == NULL) // no items
  134.     {
  135.         return head2;
  136.     }
  137.  
  138.     if (*head && (*head)->next == NULL) // 1 item in the list
  139.     {
  140.         head2 = *head;
  141.         return head2;
  142.     }
  143.  
  144.  
  145.     // look for head
  146.  
  147.     if (temp->value > temp->next->value) // first item bigger
  148.     {
  149.         head2 = temp;
  150.         temp2 = head2;
  151.         temp = temp->next;
  152.         temp2->next = NULL;
  153.     }
  154.  
  155.  
  156.     if (head2 == NULL) // first item is not bigger
  157.     {
  158.         while (temp->next->next != NULL && temp->next != NULL)
  159.         {
  160.             if (temp->value < temp->next->value && temp->next->value > temp->next->next->value)
  161.             {
  162.                 head2 = temp->next;
  163.                 temp->next = temp->next->next;
  164.                 break;
  165.             }
  166.  
  167.             else temp = temp->next;
  168.         }
  169.     }
  170.  
  171.     // finish looking for head
  172.  
  173.     if (head2 == NULL) // no head found
  174.         return head2;
  175.  
  176.     else // head2 is not empty
  177.     {
  178.         temp2 = head2; // to not lose head2
  179.  
  180.         if (temp->next) // after search for head
  181.             temp = temp->next;
  182.  
  183.         else // if next node is null
  184.             return head2;
  185.  
  186.  
  187.         while (temp->next->next != NULL && temp->next != NULL) // start algorithm
  188.         {
  189.             if (temp->value < temp->next->value && temp->next->value > temp->next->next->value) // success finding
  190.             {
  191.                 temp2->next = temp->next;
  192.                 temp2 = temp2->next;
  193.                 temp->next = temp->next->next;
  194.                 temp2->next = NULL; // very important!! disconnect from next node
  195.             }
  196.  
  197.             if (temp->next)
  198.                 temp = temp->next;
  199.         }
  200.  
  201.         if (temp->next->value > temp->value) // last item
  202.         {
  203.             temp2->next = temp->next;
  204.             temp2 = temp2->next;
  205.             temp->next = temp->next->next;
  206.             temp2->next = NULL;
  207.         }
  208.     }
  209.  
  210.     return head2;
  211. }
  212.  
  213. void main()
  214. {
  215.     node4* head = NULL;
  216.  
  217.     insert(&head, 3);
  218.     insert(&head, 6);
  219.     insert(&head, 1);
  220.     insert(&head, 9);
  221.     insert(&head, 8);
  222.     insert(&head, 4);
  223.     insert(&head, 5);
  224.  
  225.     printf("List 1: ");
  226.     print_list(head);
  227.  
  228.     printf("\nList 2: ");
  229.  
  230.     node4* temp = head;
  231.  
  232.     node4* head2 = createList(&head);
  233.  
  234.     printf("\n\nNew List 2: ");
  235.     print_list(head2);
  236.  
  237.     printf("\nNew List 1: ");
  238.     print_list(head);
  239. }
  240.  
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×