Advertisement
Guest User

Untitled

a guest
May 27th, 2015
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.30 KB | None | 0 0
  1. // окончательный вариант.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <stdlib.h>
  6. #include <cstdio>
  7. #include "locale.h"
  8. #include <cstdlib>
  9. #include <Windows.h>
  10. #pragma warning (disable:4996)
  11.  
  12. typedef struct R
  13. {
  14. char name[25];//название книги
  15. char writer[50];//имя автора
  16. char *genre;//жанр
  17. int data;//год издания
  18. }Books;
  19.  
  20. typedef struct T
  21. {
  22. Books *book;//указатель на информационные поля
  23. struct T *next;//указатель на следующий элемент
  24. }List;
  25.  
  26. int Menu();//вывод главного меню
  27. int Menu1();//вывод подменю для добавления элемента
  28. int Menu2();//вывод подменю для удаления элемента
  29. List* InputOne();//ввод элемента списка
  30. char* InputGenre();//ввод поля "жанр"
  31. void OutputList(List*);//вывод списка на экран
  32. List* NewBegin(List*);//добавление элемента в начало списка
  33. void NewPlace(List*);//добавление элемента в место, указанное пользователем
  34. void NewEnd(List*);//добавление элемента в конец списка
  35. List* DeleteBegin(List*);//удаление первого элемента списка
  36. void DeletePlace(List*);//удаление элемента, указанного пользователем
  37. void DeleteEnd(List*);//удаление последнего элемента
  38. void Free(List*);//освобождение памяти
  39. List* NewList(List*);//формирование нового списка
  40.  
  41. void main()
  42. {
  43. List *first = NULL, *second = NULL;
  44. SetConsoleCP(1251);
  45. SetConsoleOutputCP(1251);
  46. int S, s;
  47. bool A = false, B = false;
  48. do
  49. {
  50. system("cls");
  51. S = Menu();
  52. switch (S)
  53. {
  54. // добавление элементов
  55. case 1:
  56. system("cls");
  57. if (A == false)
  58. {
  59. first = InputOne();
  60. A = true;
  61. }
  62. else
  63. {
  64. s = Menu1();
  65. switch (s)
  66. {
  67. // в начало
  68. case 1:
  69. system("cls");
  70. first = NewBegin(first);
  71. break;
  72. // после выбранного
  73. case 2:
  74. system("cls");
  75. NewPlace(first);
  76. break;
  77. // в конец
  78. case 3:
  79. system("cls");
  80. NewEnd(first);
  81. break;
  82. case 0:
  83. break;
  84. default:
  85. puts("Ошибка. Выберите один из пунктов меню");
  86. break;
  87. }
  88. }
  89. break;
  90.  
  91. //удаление элементов
  92. case 2:
  93. if (A == false)
  94. {
  95. system("cls");
  96. puts("Список еще не введен");
  97. system("pause");
  98. }
  99. else
  100. {
  101. system("cls");
  102. s = Menu2();
  103. switch (s)
  104. {
  105. // первый элемент
  106. case 1:
  107. system("cls");
  108. first = DeleteBegin(first);
  109. puts("Элемент удален");
  110. system("pause");
  111. break;
  112. // выбранный элемент
  113. case 2:
  114. system("cls");
  115. DeletePlace(first);
  116. puts("Элемент удален");
  117. system("pause");
  118. break;
  119. // последний элемент
  120. case 3:
  121. system("cls");
  122. DeleteEnd(first);
  123. puts("Элемент удален");
  124. system("pause");
  125. break;
  126. case 0:
  127. break;
  128. default:
  129. puts("Ошибка. Выберите один из пунктов меню");
  130. break;
  131. }
  132. }
  133. break;
  134. case 3:
  135. system("cls");
  136. second = NewList(first);
  137. if (second == NULL)
  138. puts("В исходном списке нет элементов, удовлетворяющих условию");
  139. else
  140. {
  141. puts("Список сформирован");
  142. B = true;
  143. }
  144. system("pause");
  145. break;
  146. case 4:
  147. system("cls");
  148.  
  149. if (A == true && B == true)
  150. {
  151. puts("Выберите один из пунктов меню");
  152. puts("1.Показать исходный список");
  153. puts("2.Показать сформированный список");
  154. puts("0.Вернуться в главное меню");
  155. scanf_s("%d", &s);
  156. switch (s)
  157. {
  158. case 1:
  159. system("cls");
  160. OutputList(first);
  161. system("pause");
  162. break;
  163. case 2:
  164. system("cls");
  165. OutputList(second);
  166. system("pause");
  167. break;
  168. case 3:
  169. break;
  170. default:
  171. puts("Ошибка. Выберите один из пунктов меню");
  172. }
  173. }
  174. else
  175. {
  176.  
  177. system("cls");
  178. OutputList(first);
  179. system("pause");
  180.  
  181. }
  182.  
  183. break;
  184.  
  185. case 0:
  186. if (A == true)
  187. Free(first);
  188. if (B == true)
  189. Free(second);
  190. break;
  191. default:
  192. puts("Ошибка. Выберите один из пунктов меню");
  193. break;
  194. }
  195.  
  196. } while (S != 0);
  197.  
  198. }
  199.  
  200. //вывод главного меню
  201. int Menu()
  202. {
  203. int S;
  204.  
  205. puts("Выберите один из пунктов меню");
  206. puts("1.Добавление элементов в список");
  207. puts("2.Удаление элементов из списка");
  208. puts("3.Формирование нового списка");
  209. puts("4.Вывод списка");
  210. puts("0.Выход из программы");
  211.  
  212. scanf_s("%d", &S);
  213. return S;
  214. }
  215.  
  216. //вывод подменю для добавления элемента
  217. int Menu1()
  218. {
  219. int s;
  220. puts("1.Добавить элемент в начало");
  221. puts("2.Добавить элемент после выбранного элемента");
  222. puts("3.Добавить элемент в конец");
  223. puts("0.Вернуться в главное меню");
  224. scanf_s("%d", &s);
  225. return s;
  226. }
  227.  
  228. //вывод подменю для добавления элемента
  229. int Menu2()
  230. {
  231. int s;
  232. puts("1.Удалить первый элемент");
  233. puts("2.Удалить выбранный элемент");
  234. puts("3.Удалить последний элемент");
  235. puts("0.Вернуться в главное меню");
  236. scanf_s("%d", &s);
  237. return s;
  238. }
  239.  
  240. //ввод элемента списка
  241. List* InputOne()
  242. {
  243. List *N = NULL;
  244. N = (List*)malloc(sizeof(List));
  245. N->book = (Books*)malloc(sizeof(Books));
  246. N->next = NULL;
  247. do
  248. {
  249. printf("Введите название книги(не более 25 символов):");
  250. fflush(stdin);
  251. fgets((N->book->name), 30, stdin);
  252. if (strlen(N->book->name) > 25)
  253. puts("Извините, поле превышает 25 символов. Повторите ввод.");
  254. if (*(N->book->name) == '\n')
  255. puts("Извините, поле пустое. Повторите ввод.");
  256. } while ((strlen(N->book->name) > 25) || (*(N->book->name) == '\n'));
  257.  
  258. do
  259. {
  260. printf("\nВведите автора книги(не более 25 символов):");
  261. fflush(stdin);
  262. fgets(N->book->writer, 55, stdin);
  263. if (strlen(N->book->writer) > 50)
  264. puts("Извините, поле превышает 50 символов. Повторите ввод.");
  265. if (*(N->book->writer) == '\n')
  266. puts("Извините, поле пустое. Повторите ввод.");
  267. } while ((strlen(N->book->writer) > 50) || (*(N->book->writer) == '\n'));
  268.  
  269. N->book->genre = InputGenre();
  270.  
  271. do
  272. {
  273. printf("\nВведите год издания:");
  274. fflush(stdin);
  275. scanf_s("%d", &(N->book->data));
  276. if ((N->book->data) > 2016)
  277. puts("Извините, книга не может быть выпущена после 2016 года. Повторите ввод.");
  278. if ((N->book->data) <1600)
  279. puts("Извините, книга не может быть выпущена раньше 1600 года. Повторите ввод.");
  280. } while ((((N->book->data) > 2016) || ((N->book->data) < 1600)));
  281.  
  282. return N;
  283. }
  284.  
  285. //ввод поля "жанр"
  286. char* InputGenre()
  287. {
  288. int a;
  289. puts("\nВыберите жанр книги:");
  290. puts("1.Биография");
  291. puts("2.Детектив");
  292. puts("3.Детская литература");
  293. puts("4.Историческая литература");
  294. puts("5.Научная литература:");
  295. puts("6.Повесть");
  296. puts("7.Поэзия");
  297. puts("8.Роман");
  298. puts("9.Фантастика");
  299. scanf_s("%d", &a);
  300. switch (a)
  301. {
  302. case 1:
  303. return "Биография";
  304. break;
  305. case 2:
  306. return "Детектив";
  307. break;
  308. case 3:
  309. return "Детская литература";
  310. break;
  311. case 4:
  312. return "Историческая литература";
  313. break;
  314. case 5:
  315. return "Научная литература";
  316. break;
  317. case 6:
  318. return "Повесть";
  319. break;
  320. case 7:
  321. return "Поэзия";
  322. break;
  323. case 8:
  324. return "Роман";
  325. break;
  326. case 9:
  327. return "Фантастика";
  328. break;
  329. default:
  330. return ("Жанр не указан");
  331. break;
  332. }
  333. }
  334.  
  335. //добавление элемента в начало списка
  336. List* NewBegin(List *N)
  337. {
  338. List* H;
  339. H = InputOne();
  340. H->next = N;
  341. return H;
  342. }
  343.  
  344. //вывод списка на экран
  345. void OutputList(List *N)
  346. {
  347. if (N != NULL)
  348. {
  349. while (N->next != NULL)
  350. {
  351. printf("\nНазвание книги: %s", N->book->name);
  352. printf("Автор книги: %s", N->book->writer);
  353. printf("Жанр: %s\n", N->book->genre);
  354. printf("Год выпуска: %d\n", N->book->data);
  355. N = N->next;
  356. }
  357. printf("\nНазвание книги: %s", N->book->name);
  358. printf("Автор книги: %s", N->book->writer);
  359. printf("Жанр: %s\n", N->book->genre);
  360. printf("Год выпуска: %d\n", (N->book->data));
  361.  
  362. }
  363. else
  364. {
  365. puts("В списке нет элементов");
  366. system("pause");
  367. }
  368. }
  369. //добавление элемента в конец списка
  370. void NewEnd(List *N)
  371. {
  372. List* H;
  373. H = InputOne();
  374. while (N->next != NULL)
  375. N = N->next;
  376. N->next = H;
  377. }
  378.  
  379. //удаление первго элемента списка
  380. List* DeleteBegin(List* N)
  381. {
  382. List* H;
  383. H = N->next;
  384. free(N->book);
  385. free(N);
  386. return H;
  387. }
  388.  
  389. //удаление последнего элемента списка
  390. void DeleteEnd(List* N)
  391. {
  392. List* K, *H;
  393. H = N;
  394. while (H->next != NULL)
  395. H = H->next;
  396. K = H;
  397.  
  398. free(K->book);
  399. free(K);
  400. }
  401.  
  402. //добавление элемента в место, указанное пользователем
  403. void NewPlace(List* N)
  404. {
  405. List* K;
  406. int data;
  407.  
  408. do
  409. {
  410. printf("\nВведите год, после которого Вы хотите вставить элемент:");
  411. scanf_s("%d", &data);
  412. if (data > 2016)
  413. puts("Извините, книга не может быть выпущена после 2016 года. Повторите ввод.");
  414. if (data <1600)
  415. puts("Извините, книга не может быть выпущена раньше 1600 года. Повторите ввод.");
  416. } while (((data > 2016) || (data < 1600)));
  417.  
  418. while (N->book->data != data && N->next != NULL)
  419. {
  420. N = N->next;
  421. }
  422. if (N->next == NULL && N->book->data != data)
  423. {
  424.  
  425. puts("Такого элемента нет");
  426. system("pause");
  427. }
  428. else
  429. {
  430. K = InputOne();
  431. K->next = N->next;
  432. N->next = K;
  433. }
  434. }
  435.  
  436. //удаление элемента, указанного пользователем
  437. void DeletePlace(List* N)
  438. {
  439. List* H, *K;
  440. int data;
  441.  
  442. do
  443. {
  444. printf("\nВведите год элемента, который вы хотите удалить:");
  445. scanf_s("%d", &data);
  446. if (data > 2016)
  447. puts("Извините, книга не может быть выпущена после 2016 года. Повторите ввод.");
  448. if (data <1600)
  449. puts("Извините, книга не может быть выпущена раньше 1600 года. Повторите ввод.");
  450. } while (((data > 2016) || (data < 1600)));
  451.  
  452. while ((N->next)->book->data != data && N->next->next!= NULL)
  453. N = N->next;
  454. if (N->next->next == NULL && N->book->data != data)
  455. {
  456.  
  457. puts("Такого элемента нет");
  458. system("pause");
  459. }
  460. else
  461. {
  462. K = N->next;
  463. N->next = N->next->next;
  464. free(K->book);
  465. free(K);
  466. }
  467. }
  468.  
  469. //освобождение памяти
  470. void Free(List* N)
  471.  
  472. {
  473. if (N != NULL)
  474. {
  475. List* H, *K = NULL;
  476. Books* M;
  477.  
  478. while (N->next != NULL)
  479. {
  480. H = N->next;
  481. K = N;
  482. free(N->book->genre);
  483. M = N->book;
  484. free(M);
  485. free(K);
  486. if (H != NULL)
  487. N = H;
  488. }
  489. free(N->book);
  490. free(N);
  491. }
  492. }
  493.  
  494. //формирование нового списка
  495. List* NewList(List* N)
  496. {
  497. List* NN = NULL, *B;
  498. int data;
  499. do
  500. {
  501. printf("\nВведите год, начиная с которого Вы хотите сформировать список:");
  502. scanf_s("%d", &data);
  503. if (data > 2016)
  504. puts("Извините, книга не может быть выпущена после 2016 года. Повторите ввод.");
  505. if (data <1600)
  506. puts("Извините, книга не может быть выпущена раньше 1600 года. Повторите ввод.");
  507. } while (((data > 2016) || (data < 1600)));
  508. do
  509. {
  510. if (N->book->data >= data)
  511. {
  512. B = (List*)malloc(sizeof(List));
  513. B->book = N->book;
  514. B->next = NULL;
  515. if (NN != NULL)
  516. NN->next = B;
  517. else
  518. NN = B;
  519. }
  520. N = N->next;
  521. } while (N != NULL);
  522. return NN;
  523. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement