DarkDevourer

Лабораторная 2 - без дескриптора

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