Advertisement
Guest User

Untitled

a guest
Apr 26th, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.08 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <math.h>
  6.  
  7. typedef struct listNode {
  8.  
  9. int* dataPtr;
  10.  
  11. struct listNode* next;
  12.  
  13. }ListNode;
  14.  
  15.  
  16.  
  17. typedef struct list
  18.  
  19. {
  20.  
  21. ListNode* head;
  22.  
  23. ListNode* tail;
  24.  
  25. }List;
  26.  
  27. List getList();
  28. void insertDataToEndList(List* lst, int num);
  29. void AddNewListNodeToTail(List* lst);
  30. ListNode* CreateListNode();
  31. void MemoryAllocationFailed();
  32. List merge(List lst1, List lst2);
  33. void makeEmptyList(List* lst);
  34. void mergeRekursion(ListNode* curr1, ListNode* curr2, List *merged);
  35. void insertListNodeToTail(List* lst, ListNode* node);
  36. void printList(List* lst);
  37. void freeList(List* lst);
  38.  
  39. void main()
  40. {
  41.  
  42. List lst1, lst2, mergedList;
  43.  
  44. lst1 = getList();
  45. lst2 = getList();
  46.  
  47. mergedList = merge(lst1, lst2);
  48.  
  49. printList(&mergedList);
  50.  
  51. freeList(&mergedList);
  52.  
  53. }
  54.  
  55. List getList()
  56. {
  57. List res;
  58. int size, num, i;
  59.  
  60. makeEmptyList(&res);
  61.  
  62. scanf("%d", &size);
  63.  
  64. for (i = 0; i < size; i++)
  65. {
  66. scanf("%d", &num);
  67. insertDataToEndList(&res, num);
  68. }
  69.  
  70. return res;
  71.  
  72. }
  73.  
  74. void insertDataToEndList(List* lst, int num)
  75. {
  76. AddNewListNodeToTail(lst);
  77. *(lst->tail->dataPtr) = num;
  78. }
  79.  
  80. void AddNewListNodeToTail(List* lst)
  81. {
  82. ListNode* node = CreateListNode();
  83.  
  84. if (lst->head == NULL)
  85. {
  86. lst->head = lst->tail = node;
  87. }
  88. else
  89. {
  90. lst->tail->next = node;
  91. lst->tail = node;
  92. }
  93. }
  94.  
  95. ListNode* CreateListNode()
  96. {
  97. ListNode* node = (ListNode*)malloc(sizeof(ListNode));
  98. if (!node)
  99. MemoryAllocationFailed();
  100.  
  101. node->dataPtr = (int*)malloc(sizeof(int));
  102. if (!(node->dataPtr))
  103. MemoryAllocationFailed();
  104.  
  105. node->next = NULL;
  106.  
  107. return node;
  108. }
  109.  
  110. void MemoryAllocationFailed()
  111. {
  112. printf("Memory Allocation Failed!");
  113. exit(-1);
  114. }
  115.  
  116. List merge(List lst1, List lst2)
  117. {
  118. List merged;
  119. makeEmptyList(&merged);
  120. ListNode* curr1 = lst1.head;
  121. ListNode* curr2 = lst2.head;
  122.  
  123. mergeRekursion(curr1, curr2, &merged);
  124.  
  125. return merged;
  126.  
  127. }
  128.  
  129. void makeEmptyList(List* lst)
  130. {
  131. lst->head = lst->tail = NULL;
  132. }
  133.  
  134. void mergeRekursion(ListNode* curr1, ListNode* curr2, List *merged)
  135. {
  136. if (curr1 == NULL && curr2 == NULL)
  137. return;
  138.  
  139. if (curr1 != NULL)
  140. {
  141. if (curr2 == NULL || *(curr1->dataPtr) > *(curr2->dataPtr))
  142. {
  143. insertListNodeToTail(merged, curr1);
  144. mergeRekursion(curr1->next, curr2, merged);
  145. }
  146.  
  147. else
  148. {
  149. insertListNodeToTail(merged, curr2);
  150. mergeRekursion(curr1, curr2->next, merged);
  151. }
  152. }
  153. else
  154. {
  155. insertListNodeToTail(merged, curr2);
  156. mergeRekursion(curr1, curr2->next, merged);
  157. }
  158.  
  159.  
  160.  
  161. }
  162.  
  163. void insertListNodeToTail(List* lst, ListNode* node)
  164. {
  165. if (lst->head == NULL)
  166. {
  167. lst->head = lst->tail = node;
  168. }
  169. else
  170. {
  171. lst->tail->next = node;
  172. lst->tail = node;
  173. }
  174. }
  175.  
  176. void printList(List* lst)
  177. {
  178. ListNode* curr = lst->head;
  179. while (curr != NULL)
  180. {
  181. printf("%d ", *(curr->dataPtr));
  182. curr = curr->next;
  183. }
  184. printf("\n");
  185. }
  186.  
  187. void freeList(List* lst)
  188. {
  189. ListNode* curr = lst->head, *saver;
  190.  
  191. while (curr != NULL)
  192. {
  193. saver = curr->next;
  194. free(curr->dataPtr);
  195. free(curr);
  196. curr = saver;
  197. }
  198. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement