Advertisement
Guest User

Untitled

a guest
Apr 6th, 2020
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.08 KB | None | 0 0
  1. #define SIZE 10
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. struct listNode {
  6.   int data;
  7.   struct listNode *nextPtr;
  8. };
  9.  
  10. typedef struct listNode ListNode;
  11. typedef ListNode * ListNodePtr;
  12.  
  13. // function prototypes
  14. ListNodePtr merge(ListNodePtr const l1, ListNodePtr const l2);
  15. void displayElements(ListNodePtr const startPtr);
  16. void freeList(ListNodePtr startPtr);
  17.  
  18. int main(void)
  19. {
  20.   ListNodePtr cl1, cl2;
  21.   ListNodePtr l1, l2;
  22.   ListNodePtr result;
  23.  
  24.   cl1 = malloc(sizeof(ListNode));
  25.   if (cl1 == NULL) return -1;
  26.   cl1->data = 0;
  27.   cl1->nextPtr = NULL;
  28.   l1 = cl1;
  29.   cl2 = malloc(sizeof(ListNode));
  30.   if (cl2 == NULL) return -1;
  31.   cl2->data = 1;
  32.   cl2->nextPtr = NULL;
  33.   l2 = cl2;
  34.   for (size_t i = 2; i < SIZE; i+=2) {
  35.     if ((cl1->nextPtr = malloc(sizeof(ListNode))) == NULL) return -1;
  36.     cl1 = cl1->nextPtr;
  37.     cl1->data = i;
  38.     cl1->nextPtr = NULL;
  39.     if ((cl2->nextPtr = malloc(sizeof(ListNode))) == NULL) return -1;
  40.     cl2 = cl2->nextPtr;
  41.     cl2->data = i+1;
  42.     cl2->nextPtr = NULL;
  43.   }
  44.  
  45.   puts("First list:");
  46.   displayElements(l1); // print the list
  47.   puts("\n");
  48.   puts("Second list:");
  49.   displayElements(l2); // print the list
  50.   puts("\n");
  51.   result =  merge(l1, l2); // merge the lists
  52.   puts("Merged list:");
  53.   displayElements(result); // print the list
  54.   freeList(l1);
  55.   freeList(l2);
  56.   freeList(result);
  57. }
  58.  
  59. // merge two sorted lists into a single sorted list
  60. ListNodePtr merge(ListNodePtr const l1, ListNodePtr const l2) {
  61.   ListNodePtr cl1, cl2;
  62.   ListNodePtr result;
  63.   ListNodePtr rc;
  64.  
  65.   cl1 = l1; cl2 = l2;
  66.   if ((rc = malloc(sizeof(ListNode))) == NULL)
  67.       return NULL;
  68.   rc->nextPtr = NULL;
  69.   result = rc;
  70.   while ((cl1 != NULL) && (cl2 != NULL)) {
  71.     if ((cl1->data) <= (cl2->data)) {
  72.       rc->data = cl1->data;
  73.       cl1 = cl1->nextPtr;
  74.     }
  75.     else {
  76.       rc->data = cl2->data;
  77.       cl2 = cl2->nextPtr;
  78.     }
  79.     if ((rc->nextPtr = malloc(sizeof(ListNode))) == NULL) {
  80.       freeList(result);
  81.       return NULL;
  82.     }
  83.     rc = rc->nextPtr;
  84.     rc->nextPtr = NULL;
  85.   }
  86.   if (cl1 == NULL) {
  87.     rc->data = cl2->data;
  88.     while ((cl2 = cl2->nextPtr) != NULL) {
  89.       if ((rc->nextPtr = malloc(sizeof(ListNode))) == NULL) {
  90.         freeList(result);
  91.         return NULL;
  92.       }
  93.       rc = rc->nextPtr;
  94.       rc->data = cl2->data;
  95.       rc->nextPtr = NULL;
  96.     }
  97.   }
  98.   else {
  99.     rc->data = cl1->data;
  100.     while ((cl1 = cl1->nextPtr) != NULL) {
  101.       if ((rc->nextPtr = malloc(sizeof(ListNode))) == NULL) {
  102.         freeList(result);
  103.         return NULL;
  104.       }
  105.       rc = rc->nextPtr;
  106.       rc->data = cl1->data;
  107.       rc->nextPtr = NULL;
  108.     }
  109.   }
  110.  
  111.   return result;
  112. }
  113.  
  114. // display elements in list
  115. void displayElements(ListNodePtr const startPtr) {
  116.   ListNodePtr pp = startPtr;
  117.   while (pp != NULL) {
  118.     printf(" -> %d", pp->data);
  119.     pp = pp->nextPtr;
  120.   }
  121.   printf("\n");
  122. }
  123.  
  124. // free memory of a list
  125. void freeList(ListNodePtr startPtr) {
  126.   ListNodePtr pp = startPtr;
  127.   ListNodePtr ppp;
  128.  
  129.   while (pp != NULL) {
  130.     ppp = pp->nextPtr;
  131.     free(pp);
  132.     pp = ppp;
  133.   }
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement