constk

Lab_Lists_TrueOne

Mar 17th, 2020
162
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <iostream>
  4. #include <ctime>
  5.  
  6. typedef struct NODE
  7. {
  8. int inf;
  9. NODE* link;
  10. };
  11.  
  12. void createList(NODE*, const size_t size);//Создать список, проинициализировать его нулями
  13. void initList(NODE*, int min, int max);//Проинициализировать список случайными значениями от min до max
  14. void inputList(NODE*);//Ввести список с клавиатуры
  15. void showList(NODE*);//Вывести список на экран
  16.  
  17. NODE* proc(NODE*, NODE*);//Функция из 1 задания. Возвращает указатель на список-результат
  18.  
  19. int main()
  20. {
  21. setlocale(0, "Russian");
  22. srand(time(NULL));
  23.  
  24. NODE* head1 = new NODE;
  25. NODE* head2 = new NODE;
  26.  
  27. size_t size = 0;
  28. printf("Введите размер списков: ");
  29. scanf("%d", &size);
  30.  
  31. puts("Введите 1-ый список:");
  32. createList(head1, size);
  33. inputList(head1);
  34. puts("1 список:");
  35. showList(head1);
  36.  
  37. puts("Введите 2-ый список:");
  38. createList(head2, size);
  39. inputList(head2);
  40. puts("2 список:");
  41. showList(head2);
  42.  
  43. NODE* head = proc(head1, head2);
  44. puts("\nРезультат: ");
  45. showList(head);
  46.  
  47. system("pause");
  48. return 0;
  49. }
  50.  
  51. void createList(NODE* head, const size_t size)
  52. {
  53. NODE* tmp = NULL;
  54. NODE* current = head;
  55.  
  56. current->inf = 0;
  57. current->link = NULL;
  58.  
  59. for (int i = 1; i != size; ++i)
  60. {
  61. tmp = new NODE;
  62. tmp->inf = 0;
  63. tmp->link = NULL;
  64.  
  65. current->link = tmp;
  66. current = tmp;
  67. }
  68. }
  69.  
  70. void inputList(NODE* head)
  71. {
  72. NODE* current = head;
  73. do
  74. {
  75. printf("Введите элемент: ");
  76. scanf("%d", &current->inf);
  77. current = current->link;
  78. } while (current);
  79. }
  80.  
  81. void initList(NODE* head, int min, int max)
  82. {
  83. NODE* current = head;
  84. do
  85. {
  86. current->inf = rand() % (max - min + 1) + min;
  87. current = current->link;
  88. } while (current);
  89. }
  90.  
  91. void showList(NODE* head)
  92. {
  93. if (!head)
  94. {
  95. puts("Список пуст");
  96. return;
  97. }
  98. NODE* current = head;
  99. do
  100. {
  101. printf("%3d", current->inf);
  102. current = current->link;
  103. } while (current);
  104. puts("");
  105. }
  106.  
  107. NODE* proc(NODE* head1, NODE* head2)
  108. {
  109. NODE* result = NULL;
  110. NODE* current = result;
  111. NODE* current1 = head1;
  112. NODE* current2 = head2;
  113. NODE* tmp;
  114.  
  115. bool firstNodeCreated = false;
  116.  
  117. //Ищем равные элементы
  118. do
  119. {
  120. //Если элементы равны
  121. if (current1->inf == current2->inf)
  122. {
  123. //Если создан первый узел списка
  124. if (firstNodeCreated)
  125. {
  126. //Создаём новый узел со значением из списка 1
  127. tmp = new NODE;
  128. tmp->inf = current1->inf;
  129. tmp->link = NULL;
  130.  
  131. current->link = tmp;
  132. current = tmp;
  133.  
  134. }
  135. //Если первого узла нет
  136. else
  137. {
  138. //Создаём первый узел
  139. result = new NODE;
  140. result->inf = current1->inf;
  141. result->link = NULL;
  142.  
  143. //Перемещаем указатель на этот узел
  144. current = result;
  145.  
  146. firstNodeCreated = true;
  147. }
  148. }
  149. current1 = current1->link;
  150. current2 = current2->link;
  151. } while (current1 && current2);
  152.  
  153. //Устанавливаем указатели на начало списков 1 и 2
  154. current1 = head1;
  155. current2 = head2;
  156.  
  157. //Ищем не равные элементы
  158. do
  159. {
  160. //Если элементы не равны
  161. if (current1->inf != current2->inf)
  162. {
  163. //Если создан первый узел списка
  164. if (firstNodeCreated)
  165. {
  166. //Добавляем элемент в начало
  167. tmp = new NODE;
  168. tmp->inf = current1->inf;
  169. tmp->link = result;
  170. result = tmp;
  171.  
  172. //Добавляем элемент в конец
  173. tmp = new NODE;
  174. tmp->inf = current2->inf;
  175. tmp->link = NULL;
  176. current->link = tmp;
  177.  
  178. //Перемещаем указатель на конец списка
  179. current = current->link;
  180. }
  181. //Если первого узла нет
  182. else
  183. {
  184. //Создаём первый узел списка со значением из списка 1
  185. result = new NODE;
  186. result->inf = current1->inf;
  187. result->link = new NODE;
  188.  
  189. //Создаём второй узел списка со значением из списка 2
  190. result->link->inf = current2->inf;
  191. result->link->link = NULL;
  192.  
  193. //Перемещаем указатель на конец списка
  194. current = result->link;
  195.  
  196. firstNodeCreated = true;
  197. }
  198. }
  199. current1 = current1->link;
  200. current2 = current2->link;
  201. } while (current1 && current2);
  202.  
  203. return result;
  204. }
RAW Paste Data