DarkDevourer

Лаб 2 - с функциями

Nov 1st, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.53 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <malloc.h>
  4. struct list //Список
  5. {
  6. struct list *prev; //Указатель на предыдущий элемент списка (= NULL, если первый элемент)
  7. float data; //Элемент списка
  8. struct list *next; //Указатель на следующий элемент списка (= NULL, если последний элемент)
  9. }*ptr, *ptr1, *desc; //Указатель на начало списка
  10. void ListCreation(int *list_exist, int *N); //Подпрограмма для добавления элемента
  11. void ListOutput(int *list_exist, int *N); //Подпрограмма для вывода списка
  12. void ListDelete(int *list_exist, int *N); //Подпрограмма для удаления списка
  13. void ListSearchMax(int *list_exist, int *N); //Подпрограмма для поиска индексов наибольших элементов списка
  14. void ListAddData(int *list_exist, int *N); //Подпрограмма для добавления элемента
  15. void ListDeleteEnd(int *list_exist, int *N); //Подпрограмма для удаления последнего элемента списка
  16. void main()
  17. {
  18. int key, list_exist = 0, N, N1, i;
  19. float temp;
  20. while (1)
  21. {
  22. printf("Choose function.\n1 - create list.\n2 - output list.\n3 - delete list.\n4 - find max.\n5 - add new data in any place.\n6 - delete last data.\n0 - exit.\n"); //Выбор действия
  23. scanf("%d", &key); //Ввод клавиши действия
  24. switch (key)
  25. {
  26. case 1: // Создание списка
  27. {
  28. ListCreation(&list_exist, &N);
  29. break;
  30. }
  31. case 2: //Вывод списка
  32. {
  33. ListOutput(&list_exist, &N);
  34. break;
  35. }
  36. case 3: //Очистка (удаление) списка
  37. {
  38. ListDelete(&list_exist, &N);
  39. break;
  40. }
  41. case 4: //Нахождение индексов максимальных элементов списка
  42. {
  43. ListSearchMax(&list_exist, &N);
  44. break;
  45. }
  46. case 5: //Добавление элемента в любое место списка
  47. {
  48. ListAddData(&list_exist, &N);
  49. break;
  50. }
  51. case 6: //Удаление элемента из конца списка
  52. {
  53. ListDeleteEnd(&list_exist, &N);
  54. break;
  55. }
  56. case 0:
  57. {
  58. printf("Exiting program.\n"); //Выход из программы
  59. break;
  60. }
  61. default: //Если выбранной команды не существует
  62. {
  63. printf("This feature doesn't exist. Please try again.\n");
  64. break;
  65. }
  66. }
  67. if (key == 0)
  68. break;
  69. }
  70. }
  71. void ListCreation(int *list_exist, int *N) //Подпрограмма для вывода списка
  72. {
  73. int i;
  74. float temp;
  75. if (*list_exist == 1) //Если список уже существует
  76. {
  77. printf("List is already created. Please create it before.\n");
  78. }
  79. else //Создание списка в случае его отсутствия
  80. {
  81. printf("Enter list size.\n");
  82. scanf("%d", N); //Ввод размера списка
  83. if (*N > 0)
  84. {
  85. struct list *ptr;
  86. ptr = malloc(sizeof(struct list)); //Выделение памяти под первый элемент списка
  87. desc = ptr;
  88. ptr->prev = NULL; //Присвоение указателю на предыдущий элемент значения NULL
  89. ptr->next = NULL; //Присвоение указателю на следующий элемент значения NULL
  90. printf("Input new data.\n");
  91. scanf("%f", &temp); //Ввод элемента списка в промежуточное хранилище
  92. ptr->data = temp; //Запись значения в список
  93. for (i = 1; i < *N; i++)
  94. {
  95. ptr1 = malloc(sizeof(struct list)); //Выделение памяти под элемент списка
  96. printf("Input new data.\n");
  97. scanf("%f", &temp); //Ввод элемента списка в промежуточное хранилище
  98. ptr1->data = temp; //Запись значения в список
  99. ptr1->prev = ptr; //Запись указателя на предыдущий (i-1) элемент
  100. ptr1->next = NULL; //Присвоение указателю на следующий элемент значения NULL
  101. ptr->next = ptr1; //Запись указателя на следующий элемент (производится в i-1 элементе)
  102. ptr = ptr1;
  103. }
  104. printf("List is successfully created.\n");
  105. *list_exist = 1; //Перевод флага в значение "Список создан"
  106. }
  107. }
  108. }
  109. void ListOutput(int *list_exist, int *N) //Подпрограмма для вывода списка
  110. {
  111. int key1, i;
  112. if (*list_exist == 0) // Если список не существует
  113. {
  114. printf("List doesn't exist, it's impossible to show it.\n");
  115. }
  116. else // Если список существует
  117. {
  118. printf("Choose output type.\n1 - screen.\n2 - file.\n");
  119. scanf("%d", &key1); //Выбор вида вывода
  120. if (key1 == 1) //Вывод списка на экран
  121. {
  122. ptr = desc;
  123. for (i = 0; i < *N; i++)
  124. {
  125. printf("data[%d] = %f\n", i + 1, ptr->data); //Вывод данных на экран
  126. ptr = ptr->next; //Переход к следующему элементу
  127. }
  128.  
  129. }
  130. else if (key1 == 2) //Запись списка в файл
  131. {
  132. FILE *out;
  133. out = fopen("C:\\test\\SIAODlab2.txt", "wt"); //Открытие файла в режиме записи для записи списка
  134. if (out == NULL) //Если файл открыть не удалось
  135. {
  136. printf("File didn't open.\n");
  137. }
  138. else //Если файл открыть удалось
  139. {
  140. ptr = desc;
  141. for (i = 0; i < *N; i++)
  142. {
  143. fprintf(out, "%f [%d]\n", ptr->data, i + 1); //Запись элемента списка и его индекса в файл
  144. ptr = ptr->next; //Переход к следующему элементу
  145. }
  146. fclose(out);
  147. }
  148. }
  149. printf("Successful output.\n");
  150. }
  151. }
  152. void ListDelete(int *list_exist, int *N) //Подпрограмма для удаления списка
  153. {
  154. int i;
  155. if (*list_exist == 0) // Если списка не существует
  156. {
  157. printf("List wasn't created. Please create it before.\n");
  158. }
  159. else //Если список существует
  160. {
  161. if (*N == 1) //Если один элемент
  162. {
  163. free(desc); //Освобождение памяти (дескриптор)
  164. }
  165. else if (*N == 2) //Если два элемента
  166. {
  167. ptr1 = desc->next; //Указатель ptr1 на 2-ой элемент списка
  168. free(ptr1); //Освобождение памяти (ptr1)
  169. free(desc); //Освобождение памяти (дескриптор)
  170. }
  171. else //Если больше двух элементов
  172. {
  173. ptr = desc->next; //Указатель ptr на 2-ой элемент списка
  174. ptr1 = ptr->next; //Указатель ptr1 на 3-ой элемент списка
  175. for (i = 2; i < *N - 1; i++)
  176. {
  177. free(ptr); //Освобождение памяти (ptr)
  178. ptr = ptr1; //Указатель ptr на i-ый элемент списка
  179. ptr1 = ptr->next; //Указатель ptr1 на i+1-ый элемент списка
  180. }
  181. free(ptr); //Освобождение памяти (ptr1)
  182. free(ptr1); //Освобождение памяти (ptr)
  183. free(desc); //Освобождение памяти (дескриптор)
  184. }
  185. printf("List is successfully deleted.\n");
  186. *list_exist = 0; //Перевод флага в значение "Список отсутствует"
  187. }
  188. }
  189. void ListSearchMax(int *list_exist, int *N) //Подпрограмма для поиска индексов наибольших элементов списка
  190. {
  191. int temp, i;
  192. if (*list_exist == 0) // Если списка не существует
  193. {
  194. printf("List wasn't created. Please create it before.\n");
  195. }
  196. else //Если список существует
  197. {
  198. ptr = desc;
  199. temp = desc->data; //Данные первого элемента предполагаем как наибольшие
  200. for (i = 1; i < *N; i++) //Цикл поиска наибольшего элемента
  201. {
  202. ptr = ptr->next;
  203. if (ptr->data > temp)
  204. {
  205. temp = ptr->data; //Если в i-ом данные >, чем записанные максимальные, то они становятся новыми максимальными
  206. }
  207. }
  208. ptr = desc;
  209. printf("Max data indexes:\n");
  210. for (i = 0; i < *N; i++)
  211. {
  212. if (ptr->data == temp)
  213. {
  214. printf("[%d]\n", i + 1); //Если 1-ый элемент - наибольший, выводим его индекс
  215. }
  216. ptr = ptr->next;
  217. }
  218. printf("Searching max element is successfully completed.\n");
  219. }
  220. }
  221. void ListAddData(int *list_exist, int *N) //Подпрограмма для добавления элемента
  222. {
  223. int i, N1;
  224. float temp;
  225. if (*list_exist == 0) // Если списка не существует
  226. {
  227. printf("List wasn't created. Please create it before.\n");
  228. }
  229. else //Если список существeет
  230. {
  231. printf("Choose place, where you want to add new data. Avaliable space: from 1 to %d.\n", (*N) + 1);
  232. scanf("%d", &N1); //Ввод индекса нового элемента
  233. if ((N1 > (*N)+1 ) || (N1 < 1)) //Если элемент невозможно добавить
  234. {
  235. printf("It's impossible to add new data at that place.");
  236. }
  237. else
  238. {
  239. ptr1 = malloc(sizeof(struct list)); //Выделение памяти под элемент списка
  240. ptr = desc;
  241. for (i = 0; i < N1 - 2; i++)
  242. {
  243. ptr = ptr->next; //Переходим к элементу, предшествующему новому
  244. }
  245. if (N1 == 1) //Если добавляем элемент в начало
  246. {
  247. ptr1->prev = NULL; //Присвоение указателю на предыдущий элемент значения NULL
  248. ptr1->next = desc; //Для нового элемента запись указателя на следующий элемент (который был первым)
  249. desc->prev = ptr1; //Для старого элемента запись указателя на предыдущий элемент (на новый элемент)
  250. desc = ptr1; //Дескриптор теперь указывает на новый первый элемент
  251.  
  252. }
  253. else if (N1 - 1 == *N) //Если добавляем элемент в конец
  254. {
  255. ptr1->next = NULL; //Для нового элемента указатель на следующий элемент равен NULL
  256. ptr1->prev = ptr; //Для нового элемента запись указателя на предыдущий элемент
  257. ptr->next = ptr1; //Для старого элемента запись указателя на следующий элемент (на новый элемент)
  258. }
  259. else //Если добавляем элемент не в начало и не в конец
  260. {
  261. ptr1->prev = ptr; //Для нового элемента запись указателя на предыдущий элемент
  262. ptr = ptr->next; //Переход к элементу, следующему за новым
  263. ptr->prev = ptr1; //Для старого элемента запись указателя на предыдущий элемент (на новый элемент)
  264. ptr1->next = ptr; //Для нового элемента запись указателя на следующий элемент
  265. ptr = ptr1->prev; //Возвращение к элементу, предшествующему новому
  266. ptr->next = ptr1; //Для старого элемента запись указателя на следующий элемент (на новый элемент)
  267. }
  268. printf("Enter new data.\n"); //Ввод данных в новый элемент
  269. scanf("%f", &temp); //Ввод данных в новый элемент
  270. ptr1->data = temp; //Запись данных в новый элемент списка
  271. printf("Data is successfully added.\n");
  272. (*N)++;
  273. }
  274. }
  275. }
  276. void ListDeleteEnd(int *list_exist, int *N) //Подпрограмма для удаления последнего элемента списка
  277. {
  278. int i;
  279. if (*list_exist == 0) // Если списка не существует
  280. {
  281. printf("List wasn't created. Please create it before.\n");
  282. }
  283. else //Если список существует
  284. {
  285. if (*N == 1) //Если один элемент
  286. {
  287. free(desc); //Освобождение памяти (дескриптор)
  288. printf("There was only one list element, so the whole list was deleted. Before other operations, please create it.\n");
  289. *list_exist = 0;
  290. }
  291. else //Если больше одного элемента
  292. {
  293. ptr = desc;
  294. if (*N > 2) // Если элементов больше 2
  295. {
  296. for (i = 0; i < *N - 2; i++)
  297. {
  298. ptr = ptr->next; //Передвигаемся до предпоследнего элемента списка
  299. }
  300. }
  301. ptr1 = ptr->next; //Указатель ptr1 на предпоследний элемент списка
  302. free(ptr1); //Освобождение памяти (ptr1)
  303. ptr->next = NULL; //Обнуление указателя на следующий в первом элементе
  304. }
  305. printf("Data is successfully deleted.\n");
  306. (*N)-- ;
  307. }
  308. }
Add Comment
Please, Sign In to add comment