Advertisement
Guest User

Untitled

a guest
May 24th, 2016
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.74 KB | None | 0 0
  1. #include <clocale>
  2. #include <iostream>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <windows.h>
  6. struct Vodoem{
  7. char name[20]; // название водоема
  8. long int size; // размер водоема
  9. int number_ports; // количество портов
  10. Vodoem* next; // указатель на следующий элемент в списке
  11. };
  12. // функция добавления элемента в конец списка
  13. void spisok_add_item( Vodoem*& spisok, // указатель на начало списка
  14. char* name, // название водоема
  15. long int size, // размер водоема
  16. int number_ports
  17. )
  18. {
  19. Vodoem* p; // указатель
  20. // если в списке есть элементы
  21. if( spisok != NULL ){
  22. p = spisok; // ставим указатель на начало списка
  23. // перемещаем текущий указатель p на самый последний элемент списка
  24. while( p->next != NULL ){
  25. p = p->next;
  26. }
  27. p->next = (Vodoem*) malloc( sizeof(Vodoem) ); // создаем новый элемент
  28. p = p->next;
  29. } else {
  30. spisok = (Vodoem*) malloc( sizeof(Vodoem) ); // создаем новый элемент
  31. p = spisok;
  32. }
  33. // ИНИЦИАЛИЗИРУЕМ СОЗДАННЫЙ ЭЛЕМЕНТ СПИСКА
  34. p->next = NULL; // делаем указатель на следующий элемент NULL
  35. strcpy( p->name, name ); // копируем название
  36. p->size = size; // присваиваем размер
  37. p->number_ports = number_ports; // присваиваем количество портов
  38. }
  39. // Выводит все элементы списка на экран
  40. void spisok_print( Vodoem* spisok){
  41. Vodoem* p; // указатель
  42. p = spisok; // ставим указатель на начало списка
  43. // пока есть элементы, выводим значения элемента и перемещаем указатель на следующий
  44. printf("nn===========================================n");
  45. printf(" Данные массиваn");
  46. printf("===========================================n");
  47. printf(" Название водоема Размер Кол-во портов ");
  48. printf("n===========================================n");
  49. while( p != NULL )
  50. {
  51. printf("t%stt%dt%dn", p->name, p->size, p->number_ports );
  52. p = p->next;
  53. printf("===========================================n");
  54. }
  55. }
  56. // удаляет последний элемент в списке
  57. void spisok_remove_last_item( Vodoem*& spisok ){
  58. Vodoem* p, pback; // указатель
  59. if( spisok != NULL ){
  60. p = spisok; // ставим указатель на начало списка
  61. // если в списке 1 эоемент, то удаляем его
  62. if( p->next == NULL ){
  63. free(spisok); // удаляем элемент
  64. spisok = NULL; // делаем указатель NULL
  65. } else {
  66. // если элементов в списке много, то ищем предпоследний
  67. while( p->next->next != NULL ){
  68. p = p->next;
  69. }
  70. free(p->next); // удаляем последний элемент
  71. p->next = NULL; // делаем указатель NULL
  72. }
  73. }
  74. }
  75. void menu_vvod(Vodoem*& spisok){
  76. Vodoem* p; // указатель
  77. p = spisok; // ставим указатель на начало списка
  78. FILE *f;
  79. char name[20];
  80. long int size;
  81. int number_ports;
  82. system("cls");
  83. printf("1. Вы выбрали ввод из файлаn");
  84. f = fopen("vodoemy.txt", "r");
  85. // пока есть элементы, выводим значения элемента и перемещаем указатель на следующий
  86. while ( !feof(f) ){
  87. fscanf(f, "%st%dt%dn", name, &size, &number_ports ); // читаем из файла
  88. spisok_add_item(spisok, name, size, number_ports); // добавляем в конец списка
  89. }
  90. fclose(f);
  91. printf("Файл vodoemy.txt успешно подключен n");
  92. spisok_print(spisok);
  93. system("pause");
  94. }
  95. // добавление элемента в конец
  96. void menu_add(Vodoem*& spisok){
  97. char name[20];
  98. long int size;
  99. int number_ports;
  100. // очищаем экран
  101. system("cls");
  102. printf("2. Вы выбрали добавить элемент в конец n");
  103. printf("Введите название водоема: ");
  104. scanf("%s", name);
  105. printf("Введите размер водоема: ");
  106. scanf("%d", &size);
  107. printf("Введите количество портов: ");
  108. scanf("%d", &number_ports);
  109. printf("Элемент успешно добавлен");
  110. // добавление водоема в конец списка
  111. spisok_add_item(spisok, name, size, number_ports);
  112. spisok_print(spisok);
  113. system("pause");
  114. }
  115. void menu_print(Vodoem*& spisok){
  116. system("cls");
  117. printf("3. Вы выбрали просмотр всех элементовn");
  118. spisok_print(spisok);
  119. system("pause");
  120. }
  121. void menu_save(Vodoem*& spisok){
  122. Vodoem* p; // указатель
  123. p = spisok; // ставим указатель на начало списка
  124. FILE *f;
  125. system("cls");
  126. printf("4. Вы выбрали сохранение в файлn");
  127. f = fopen("vodoemy.txt", "w");
  128. // пока есть элементы, выводим значения элемента и перемещаем указатель на следующий
  129. while( p != NULL ){
  130. fprintf(f, "%s%d%dn", p->name, p->size, p->number_ports );
  131. p = p->next;
  132. }
  133. fclose(f);
  134. printf("Успешно сохранено в файл vodoemy.txt.n");
  135. spisok_print(spisok);
  136. system("pause");
  137. }
  138. // Возвращает указатель на элемент списка по индексу
  139. Vodoem* spisok_item_by_index(Vodoem*& spisok, int index ){
  140. int i = 0;
  141. Vodoem* p = spisok;
  142. while( p != NULL && i != index ){
  143. p = p->next;
  144. ++i;
  145. }
  146. if( i != index ){
  147. p = NULL;
  148. }
  149. return p;
  150. }
  151. void menu_korekt(Vodoem*& spisok){
  152. int index;
  153. int i;
  154. char name[20];
  155. long int size;
  156. int number_ports;
  157. Vodoem* p = spisok;
  158. system("cls");
  159. printf("5. Вы выбрали корректировка полей по индексу n");
  160. spisok_print( spisok );
  161. printf("Введите номер элемента в списке (начиная с 0): ");
  162. scanf("%d", &index);
  163. i = 0;
  164. p = spisok_item_by_index(spisok, index);
  165. if( p != NULL ){
  166. printf("%dt%st%dt%dn", i, p->name, p->size, p->number_ports );
  167. printf("Введите название водоема: ");
  168. scanf("%s", p->name);
  169. printf("Введите размер водоема: ");
  170. scanf("%d", &p->size);
  171. printf("Введите количество портов: ");
  172. scanf("%d", &p->number_ports);
  173. spisok_print( spisok );
  174. } else {
  175. printf("Элемент не найденnn");
  176. }
  177. system("pause");
  178. }
  179. // возвращает указатель на элемент по индексу
  180. Vodoem* get( Vodoem*& spisok, int index){
  181. Vodoem* p;
  182. int i = 0;
  183. p = spisok;
  184. while(i < index && p != NULL){
  185. ++i;
  186. p = p->next;
  187. }
  188. return p;
  189. }
  190. // возвращает количество элементов в списке
  191. int count( Vodoem*& spisok ){
  192. int N = 0;
  193. Vodoem *p = spisok;
  194. while( p !=NULL ){
  195. ++N;
  196. p = p->next;
  197. }
  198. return N;
  199. }
  200. void menu_sort(Vodoem*& spisok){
  201. system("cls");
  202. printf("6. Вы выбрали сортировка по размеру водоема n");
  203. // выводим на экран список
  204. printf("Do sortirovki: nn");
  205. spisok_print( spisok );
  206. int N;
  207. int i,j;
  208. // считаем количество элементов
  209. N = count(spisok);
  210. Vodoem* a, *b, *t;
  211. for(i=0; i<N; ++i){
  212. for(j=i+1; j<N; ++j){
  213. a = get(spisok, i);
  214. b = get(spisok, j);
  215. if( a->size < b->size ){
  216. Vodoem* ap = get(spisok, i-1);
  217. Vodoem* bp = get(spisok, j-1);
  218. // меняем местами
  219. ap->next = b;
  220. bp->next = a;
  221. t = a->next;
  222. a->next = b->next;
  223. b->next = t;
  224. }
  225. }
  226. }
  227. printf("nnnPosle sortirovki: nn");
  228. spisok_print( spisok );
  229. system("pause");
  230. }
  231. void menu_add_new(Vodoem*& spisok){
  232. int i, index;
  233. char name[20];
  234. long int size;
  235. int number_ports;
  236. Vodoem* p = spisok;
  237. Vodoem* new_item = NULL;
  238. Vodoem* prev_item = NULL;
  239. system("cls");
  240. printf("7. Вы выбрали вставка нового элемента перед выбраным n");
  241. spisok_print( spisok );
  242. printf("Введите номер элемента в списке (начиная с 0): ");
  243. scanf("%d", &index);
  244. p = spisok_item_by_index(spisok, index);
  245. if( p == NULL ){
  246. printf("Элемен не найденnn");
  247. } else {
  248. // Выводим информацию о водоеме, перед которым нужно вставить новый элемент
  249. printf("%dt%st%dt%dn", index, p->name, p->size, p->number_ports );
  250. // создаем объект водоема
  251. new_item = (Vodoem*) malloc( sizeof(Vodoem) );
  252. printf("Введите название водоема: ");
  253. scanf("%s", new_item->name);
  254. printf("Введите размер водоема: ");
  255. scanf("%d", &new_item->size);
  256. printf("Введите количество портов: ");
  257. scanf("%d", &new_item->number_ports);
  258. if( index > 0 ){
  259. // ищем предыдущий элемент
  260. prev_item = spisok_item_by_index(spisok, index -1 );
  261. } else {
  262. spisok = new_item;
  263. }
  264. if( prev_item != NULL ){
  265. prev_item->next = new_item;
  266. }
  267. new_item->next = p;
  268. }
  269. spisok_print( spisok );
  270. system("pause");
  271. }
  272. // удаляет список из памяти
  273. void spisok_delete(Vodoem*& spisok){
  274. }
  275. void menu(){
  276. SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода
  277. SetConsoleOutputCP(1251);
  278. // объявляем указатель на Vodoem
  279. // это будет указатель НА ПЕРВЫЙ элемент списка водоемов
  280. Vodoem* spisok = NULL; // инициируем указатель NULL
  281. int punkt_menu;
  282. do{
  283. system("cls");
  284. printf("=========================================n");
  285. printf(" Меню программы <Водоемы страны>:n");
  286. printf("=========================================n");
  287. printf("1. Ввод из файлаn");
  288. printf("2. Добавить элемент в конецn");
  289. printf("3. Просмотр всех элементовn");
  290. printf("4. Сохранение в файлn");
  291. printf("5. Корректировка полей по индексуn");
  292. printf("6. Сортировка по размеру водоемаn");
  293. printf("7. Вставка нового элемента перед выбранымn");
  294. printf("0. Выход из программыn");
  295. printf("=========================================n");
  296. printf("Введите номер пункта меню: ");
  297.  
  298. scanf("%d", &punkt_menu);
  299. switch( punkt_menu ){
  300. case 1:
  301. menu_vvod(spisok);
  302. break;
  303. case 2:
  304. menu_add(spisok);
  305. break;
  306. case 3:
  307. menu_print(spisok);
  308. break;
  309. case 4:
  310. menu_save(spisok);
  311. break;
  312. case 5:
  313. menu_korekt(spisok);
  314. break;
  315. case 6:
  316. menu_sort(spisok);
  317. break;
  318. case 7:
  319. menu_add_new(spisok);
  320. break;
  321. }
  322. } while( punkt_menu != 0 );
  323. // удаляет список из памяти
  324. void spisok_delete(Vodoem*& spisok);{
  325. Vodoem* it;
  326. Vodoem* p = spisok;
  327. // пока не достигнут последний элемент списка - удаляем элементы из памяти
  328. while( p != NULL ){
  329. it = p;
  330. p = p->next;
  331. // освобождаем память
  332. free(it);
  333. }
  334. }
  335. }
  336. int main(int argc, char *argv[])
  337. {
  338. menu();
  339. return 1;
  340. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement