Advertisement
Guest User

brg

a guest
May 27th, 2015
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.79 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include "stdlib.h"
  3. #include "locale.h"
  4. #include <string.h>
  5. #include <windows.h>
  6.  
  7. typedef struct r
  8. {
  9. char name[25]; // название моста
  10. char designer[50]; //проектировщик
  11. char country[25]; //страна, в которой мост расположен
  12. int data; //дата открытия моста
  13. } Bridges;
  14.  
  15. typedef struct t
  16. {
  17. Bridges *bridge; //инф. поля
  18. struct t *next; //указатель на следующий элемент
  19. } LIST;
  20.  
  21. LIST* InPut();
  22. Bridges* INPUT2();
  23. void TAKEIN(LIST*);
  24. void FREE(LIST*);
  25. Bridges *FREE2(Bridges*);
  26. LIST* INPUTLIST(LIST*);
  27. LIST* SEARCH(LIST*, int);
  28. LIST* SEARCHLAST(LIST*);
  29. LIST* DELETLIST(LIST*);
  30. LIST* NEWLIST(LIST*, int);
  31. LIST* NEWBEGIN(LIST*,LIST*, int);
  32. void NEWEND(LIST*);
  33. void NEWMIDDLE(LIST*, int);
  34. LIST* DELETBEGIN(LIST*);
  35. void DELETMIDDLE(LIST*, int);
  36. void DELETEND(LIST*);
  37.  
  38. int main()
  39. {
  40. SetConsoleCP(1251);
  41. SetConsoleOutputCP(1251);
  42. setlocale(LC_ALL, "rus");
  43. LIST *h = NULL;
  44. LIST *p;
  45. int q, y,e;
  46. bool A = false, B= false;
  47. do
  48. {
  49. puts("1. Ввод");
  50. puts("2. Вывод");
  51. puts("3. Сортировка");
  52. puts("4. Справка");
  53. puts("5. Выход");
  54. scanf("%d", &q);
  55. switch (q)
  56. {
  57. case 1: //ввод
  58. system("cls");
  59. h = INPUTLIST(h);
  60. A = true;
  61. system("pause");
  62. break;
  63. case 2: //вывод
  64. system("cls");
  65. puts("1.Вывод исходного списка");
  66. puts("2.Вывод нового списка");
  67. puts("3.Выход в главное меню");
  68. scanf("%d", &e);
  69. switch (e)
  70. {
  71. case 1: //вывод 1 списка
  72. if (A)
  73. {
  74. TAKEIN(h);
  75. }
  76.  
  77. else
  78. puts("Для начала введите элементы списка.");
  79. break;
  80. case 2:// вывод 2 списка
  81. if (B)
  82. {
  83. TAKEIN(p);
  84. }
  85. else
  86. puts("Новый список не сформирован.");
  87. break;
  88. case 3: //выход в главное меню
  89. break;
  90. default:
  91. puts("Такого пункта нет в меню.");
  92. break;
  93. }
  94. system("pause");
  95. break;
  96. case 3://сортировка + удаление
  97. puts("1. Формирование нового списка по заданному параметру");
  98. puts("2. Удаление элементов");
  99. puts("3. Выход в главное меню");
  100. scanf("%d", &e);
  101. switch (e)
  102. {
  103. case 1://обработка
  104. do
  105. {
  106. puts("С какого года начать формировать список.");
  107. scanf("%d", &y);
  108. if (y > 2016)
  109. puts("Извините.Год не может быть больше 2015.");
  110. puts(“Повторите ввод”);
  111. if (y < 1565)
  112. puts("Извините.Год не может быть меньше 1500.");
  113. puts(“Повторите ввод”);
  114. } while ((y > 2016) || (y < 1500));
  115. p = NEWLIST(h, y);
  116. B = true;
  117. if (p == NULL)
  118. {
  119. puts("Список не сформирован, не удалось найти элементы ");
  120. puts("удовлетворяющие условию.");
  121. B = false;
  122. }
  123. break;
  124. case 2:
  125. if (A)
  126. h = DELETLIST(h);
  127. else
  128. puts("Список не создан");
  129. break;
  130. case 3:
  131. break;
  132. }
  133. system("pause");
  134. break;
  135. case 4://справка
  136.  
  137. break;
  138. case 5:
  139. if (A)
  140. FREE(h);
  141. if (B)
  142. FREE(p);
  143. break;
  144. default:
  145. puts("Такого пункта нет в меню.");
  146. break;
  147. }
  148. } while (q != 5);
  149. system("pause");
  150. }
  151. //список
  152. LIST *InPut()
  153. {
  154. LIST *H;
  155. H = (LIST*)malloc(sizeof(LIST));
  156. H->bridge = INPUT2();
  157. H->next = NULL;
  158. return H;
  159. }
  160. //инф поля
  161. Bridges *INPUT2()
  162. {
  163. Bridges *P;
  164. P = (Bridges*)malloc(sizeof(Bridges));
  165. do // Страна
  166. {
  167. puts("Введите страну, в которой находится мост (поле не должно превышать 50 символов):");
  168. fflush(stdin);
  169. fgets(P->country, 51, stdin);
  170. if (strlen(P->country) > 50)
  171. puts("Извините, поле не должно превышать 50 символов. Повторите ввод");
  172. if (*(P->country) == '\n')
  173. puts("Поле со страной не может быть пустым.");
  174. } while ((*(P->country) == '\n') || (strlen(P->country) > 50));
  175. do // название моста
  176. {
  177. puts("Введите название моста(поле не должно превышать 50 символов):");
  178. fflush(stdin);
  179. fgets(P->name, 51, stdin);
  180. if (strlen(P->name) > 50)
  181. puts("Извините, поле не должно превышать 50 символов. Повторите ввод");
  182. if (*(P->name) == '\n')
  183. puts("Поле с названием моста не может быть пустым.");
  184. } while ((*(P->name) == '\n') || (strlen(P->name) > 50));
  185. do // год
  186. {
  187. puts("Введите год открытия моста:");
  188. fflush(stdin);
  189. scanf("%d", &(P->data));
  190. if (P->data > 2016)
  191. puts("Извините. Год не может быть больше 2015. Повторите ввод");
  192. if (P->data < 1500)
  193. puts("Извините. Год не может быть меньше 1500.Повторите ввод");
  194. } while ((P->data > 2016) || (P->data <1565));
  195. do//проектировщик
  196. {
  197. puts("Введите Имя проектировщика");
  198. fflush(stdin);
  199. fgets(P->designer, 51, stdin);
  200. if (strlen(P->designer) > 50)
  201. puts("Извините, имя проектировщика не может превышать 50 символов.Повторите ввод.");
  202. if (*(P->designer) == '\n')
  203. puts("Поле c именем проектировщика не может быть пустым.");
  204. } while ((*(P->designer) == '\n') || (strlen(P->designer) > 50));
  205. return P;
  206. }
  207. //вывод
  208. void TAKEIN(LIST *H)
  209. {
  210. while (H->next != NULL)
  211. {
  212. puts("\n");
  213. printf("Страна:\n%s", H->bridge->country);
  214. printf("Название:\n%s", H->bridge->name);
  215. printf("Год открытия %d\n", H->bridge->data);
  216. printf("Проектировщик %d\n", H->bridge->designer);
  217. H = H->next;
  218. }
  219. printf("Страна:\n%s", H->bridge->country);
  220. printf("Название:\n%s", H->bridge->name);
  221. printf("Год открытия %d\n", H->bridge->data);
  222. printf("Проектировщик :\n%s", H->bridge->designer);
  223. }
  224. //освобождение пямяти
  225. void FREE(LIST *H)
  226. {
  227. LIST *P, *L;
  228. Bridges *E;
  229. do
  230. {
  231. P = H->next;
  232. L = H;
  233. E = H->bridge;
  234. E = FREE2(E);
  235. free(L);
  236. if (P != NULL)
  237. H = P;
  238. } while (P != NULL);
  239. }
  240. // вспомогательная для освобождения памяти
  241. Bridges *FREE2(Bridges *H)
  242. {
  243. free(H);
  244. return NULL;
  245. }
  246. //создание списка
  247. LIST *INPUTLIST(LIST *H)
  248. {
  249. LIST *T= NULL;
  250. int y;
  251. int e;
  252. do
  253. {
  254. puts("1.Добавление в начало");
  255. puts("2.Добавление после выбранного элемента");
  256. puts("3.Добавление в конец");
  257. puts("4.Выход в главное меню");
  258. scanf("%d", &e);
  259. switch (e)
  260. {
  261. case 1:
  262. T = NEWBEGIN (H , NULL, 0);
  263. H = T;
  264. break;
  265. case 2:
  266. do
  267. {
  268. puts("После какого года добавить мост?.");
  269. scanf("%d", &y);
  270. if (y > 2016)
  271. puts("Извините.Год не может быть больше 2015. Повторите ввод");
  272. if (y < 1500)
  273. puts("Извините.Год не может быть меньше 1500.Повторите ввод");
  274. } while ((y > 2016) || (y < 1500));
  275. NEWMIDDLE(H, y);
  276. break;
  277. case 3:
  278. NEWEND(H);
  279. break;
  280. default:
  281. break;
  282. }
  283. } while (e != 4);
  284.  
  285. return H;
  286. }
  287. //поиск
  288. LIST *SEARCH(LIST *H, int q)
  289. {
  290. LIST *P;
  291. P = H;
  292. do
  293. {
  294. if (P->bridge->data == q)
  295. return P;
  296. P = P->next;
  297. } while (P != NULL);
  298. return NULL;
  299. }
  300. //поиск последнего элемента
  301. LIST *SEARCHLAST(LIST *H)
  302. {
  303. LIST *R;
  304. R = H;
  305. while ((R->next)->next != NULL)
  306. R = R->next;
  307. return R;
  308. }
  309. //Удаление
  310. LIST *DELETLIST(LIST *H)
  311. {
  312. int q, y;
  313. do
  314. {
  315. puts("1.Удаление первого элемента списка");
  316. puts("2.Удаление после выбранного элемента");
  317. puts("3.Удаление последнего элемента списка");
  318. puts("4.Возврат в главное меню");
  319. scanf("%d", &q);
  320. switch (q)
  321. {
  322. case 1:
  323. H = DELETBEGIN(H);
  324. break;
  325. case 2:
  326. do
  327. {
  328. puts("После какого года удалить мост?");
  329. scanf("%d", &y);
  330. if (y > 2016)
  331. puts("Извините.Год не может быть больше 2015. Повторите ввод");
  332. if (y < 1500)
  333. puts("Извините.Год не может быть меньше 1565.Повторите ввод");
  334. } while ((y > 2016) || (y < 1500));
  335. DELETMIDDLE(H, y);
  336. break;
  337. case 3:
  338. DELETEND(H);
  339. break;
  340. default:
  341. break;
  342. }
  343. } while (q != 4);
  344. return H;
  345. }
  346. //сортировка
  347. LIST *NEWLIST(LIST *P, int y)
  348. {
  349. LIST *B, *O, *Q;
  350. Q = NULL;
  351. O = NULL;
  352. do
  353. {
  354. if (P->bridge->data >= y)
  355. {
  356. B = NEWBEGIN(P, Q, 1);
  357. if (O == NULL)
  358. {
  359. O = B;
  360. B->next = NULL;
  361. }
  362. Q = B;
  363. }
  364. P = P->next;
  365. } while (P != NULL);
  366. return Q;
  367. }
  368. //Добавление в начало
  369. LIST *NEWBEGIN(LIST *H, LIST *Q, int y)
  370. {
  371. LIST *P;
  372. if (y == 0)
  373. {
  374. P = InPut();
  375. P->next = H;
  376. }
  377. else
  378. {
  379. P = (LIST*)malloc(sizeof(LIST));
  380. P->bridge = H->bridge;
  381. if (Q != NULL)
  382. Q->next = P;
  383. else
  384. {
  385. Q = P;
  386. Q->next = NULL;
  387. return Q;
  388. }
  389. }return P;
  390. }
  391. //добавление в конец
  392. void NEWEND(LIST *H)
  393. {
  394. LIST *P, *R;
  395. P = SEARCHLAST(H);
  396. R = InPut();
  397. (P->next)->next = R;
  398. }
  399. //Добавление после указанного элемента
  400. void NEWMIDDLE(LIST *H, int y)
  401. {
  402. LIST *P, *R;
  403. P = SEARCH(H, y);
  404. if (P != NULL)
  405. {
  406. R = InPut();
  407. R->next = P->next;
  408. P->next = R;
  409. }
  410. else
  411. puts("Такой даты нет в списке.");
  412. }
  413. //удаление первого элемента
  414. LIST *DELETBEGIN(LIST *H)
  415. {
  416. LIST *P;
  417. P = H->next;
  418. free(H->bridge);
  419. free(H);
  420. return P;
  421. }
  422. //удаление после указанного элемента
  423. void DELETMIDDLE(LIST* H, int y)
  424. {
  425. LIST *P, *Q;
  426. P = SEARCH(H, y);
  427. if (P != NULL)
  428. {
  429. Q = P->next;
  430. P->next = P->next->next;
  431. free(Q->bridge);
  432. free(Q);
  433. }
  434. else
  435. puts("Год не был найден");
  436. }
  437. //удаление последнего
  438. void DELETEND(LIST* H)
  439. {
  440. LIST *P, *Q;
  441. P = SEARCHLAST(H);
  442. Q = P->next;
  443. P->next = NULL;
  444. free(Q->bridge);
  445. free(Q);
  446.  
  447. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement