Advertisement
RobertMlv

Untitled

May 29th, 2021
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.15 KB | None | 0 0
  1. #include <iostream>
  2. #include <locale.h>
  3.  
  4. using namespace std;
  5.  
  6. struct sublist_element
  7. {
  8. int inf;
  9. sublist_element* next = nullptr;
  10. sublist_element* prev = nullptr;
  11. };
  12.  
  13. struct list_element
  14. {
  15. int num;
  16. sublist_element* sublist = nullptr;
  17. list_element* next = nullptr;
  18. list_element* prev = nullptr;
  19. };
  20.  
  21. int get_from_cin()
  22. {
  23. int result;
  24. cin >> result;
  25. while (cin.fail()) {
  26. cin.clear();
  27. cin.ignore(INT_MAX, '\n');
  28. cout << "Ошибка!" << endl;
  29. system("pause");
  30. cout << "Попробуйте снова: ";
  31. cin >> result;
  32. }
  33. return result;
  34. }
  35.  
  36. int choice()
  37. {
  38. int result;
  39. do {
  40. result = get_from_cin();
  41. if (result != 1 && result != 2)
  42. cout << "Ошибка ввода! Попробуйте снова: ";
  43. } while (result != 1 && result != 2);
  44. return result;
  45. }
  46.  
  47. bool isListEmpty(list_element* list)
  48. {
  49. return list->prev == list && list->next == list;
  50. }
  51.  
  52. bool isSublistEmpty(sublist_element* list)
  53. {
  54. return list->prev == list && list->next == list;
  55. }
  56.  
  57. list_element* search_list(list_element* list, int item)
  58. {
  59. if (isListEmpty(list))
  60. cout << "Список пуст!" << endl;
  61. else
  62. {
  63. list_element* t = list->next;
  64. do
  65. {
  66. if (t->num == item)
  67. return t;
  68. t = t->next;
  69. } while (t != list->next);
  70. }
  71. return nullptr;
  72. }
  73.  
  74. sublist_element* search_sublist(sublist_element* list, int inf)
  75. {
  76. if (isSublistEmpty(list))
  77. cout << "Список пуст!" << endl;
  78. else
  79. {
  80. sublist_element* t = list->next;
  81. do
  82. {
  83. if (t->inf == inf)
  84. return t;
  85. t = t->next;
  86. } while (t != list->next);
  87. }
  88. return nullptr;
  89. }
  90.  
  91. void add_to_list(list_element* list)
  92. {
  93. cout << "Введите номер списка для добавления: ";
  94. int new_item = get_from_cin();
  95.  
  96. list_element* new_element = new list_element;
  97. new_element->num = new_item;
  98.  
  99. sublist_element* new_sublist = new sublist_element;
  100. new_element->sublist = new_sublist;
  101. new_sublist->next = new_sublist;
  102. new_sublist->prev = new_sublist;
  103.  
  104. if (isListEmpty(list))
  105. {
  106. list->prev = new_element;
  107. list->next = new_element;
  108. new_element->next = new_element;
  109. new_element->prev = new_element;
  110. }
  111. else
  112. {
  113. cout <<
  114. "Добавить: " << endl <<
  115. " 1. До" << endl <<
  116. " 2. После" << endl;
  117. int add_type = choice();
  118.  
  119. system("cls");
  120.  
  121. if (add_type == 1)
  122. cout << "Добавить до: ";
  123. else
  124. cout << "Добавить после: ";
  125. int num = get_from_cin();
  126.  
  127. list_element* item_element = search_list(list, num);
  128. if (item_element == nullptr)
  129. {
  130. cout << num << " не найден";
  131. delete new_element;
  132. }
  133. else
  134. {
  135. if (add_type == 1 && list->next == item_element)
  136. list->next = new_element;
  137.  
  138. if (add_type == 2 && list->prev == item_element)
  139. list->prev = new_element;
  140.  
  141. if (add_type == 1)
  142. item_element = item_element->prev;
  143.  
  144. list_element* prev = item_element;
  145. list_element* next = item_element->next;
  146.  
  147. prev->next = new_element;
  148. next->prev = new_element;
  149.  
  150. new_element->next = next;
  151. new_element->prev = prev;
  152. }
  153. }
  154. }
  155.  
  156. void add_to_sublist(list_element* list)
  157. {
  158. cout << "Введите номер списка: ";
  159. int num = get_from_cin();
  160.  
  161. list_element* _list = search_list(list, num);
  162. if (_list == nullptr)
  163. cout << num << " не найден!" << endl;
  164. else
  165. {
  166. sublist_element* sublist = _list->sublist;
  167.  
  168. cout << "Введите значение для добавления: ";
  169. int new_item = get_from_cin();
  170.  
  171. sublist_element* new_element = new sublist_element;
  172. new_element->inf = new_item;
  173.  
  174. if (isSublistEmpty(sublist))
  175. {
  176. sublist->prev = new_element;
  177. sublist->next = new_element;
  178. new_element->next = new_element;
  179. new_element->prev = new_element;
  180. }
  181. else
  182. {
  183. cout <<
  184. "Добавить: " << endl <<
  185. " 1. До" << endl <<
  186. " 2. После" << endl;
  187. int add_type = choice();
  188.  
  189. system("cls");
  190.  
  191. if (add_type == 1)
  192. cout << "Добавить до: ";
  193. else
  194. cout << "Добавить после: ";
  195. int id = get_from_cin();
  196.  
  197. sublist_element* item_element = search_sublist(sublist, id);
  198. if (item_element == nullptr)
  199. {
  200. cout << id << " не найден!";
  201. delete new_element;
  202. }
  203. else
  204. {
  205. if (add_type == 1 && sublist->next == item_element)
  206. sublist->next = new_element;
  207.  
  208. if (add_type == 2 && sublist->prev == item_element)
  209. sublist->prev = new_element;
  210.  
  211. if (add_type == 1)
  212. item_element = item_element->prev;
  213.  
  214. sublist_element* prev = item_element;
  215. sublist_element* next = item_element->next;
  216.  
  217. prev->next = new_element;
  218. next->prev = new_element;
  219.  
  220. new_element->next = next;
  221. new_element->prev = prev;
  222. }
  223. }
  224. }
  225. }
  226.  
  227. void show(list_element* list)
  228. {
  229. if (isListEmpty(list))
  230. cout << "Список пуст!" << endl;
  231. else
  232. {
  233. list_element* t = list->next;
  234. do
  235. {
  236. cout << t->num << ": ";
  237.  
  238. sublist_element* sublist = t->sublist;
  239.  
  240. if (isSublistEmpty(sublist))
  241. cout << "пусто";
  242. else
  243. {
  244. sublist_element* t1 = sublist->next;
  245. do
  246. {
  247. cout << t1->inf << " ";
  248. t1 = t1->next;
  249. } while (t1 != sublist->next);
  250. }
  251. cout << endl;
  252. t = t->next;
  253. } while (t != list->next);
  254. }
  255. }
  256.  
  257. void del_from_list(list_element* list)
  258. {
  259. if (isListEmpty(list))
  260. cout << "Список пуст!" << endl;
  261. else
  262. {
  263. cout << "Введите номер списка для удаления: ";
  264. int num = get_from_cin();
  265.  
  266. list_element* element_delete = search_list(list, num);
  267. if (element_delete == nullptr)
  268. cout << num << " не найден" << endl;
  269.  
  270. sublist_element* sublist = element_delete->sublist;
  271.  
  272. if (!isSublistEmpty(sublist)) {
  273. sublist_element* t = sublist->next;
  274. do
  275. {
  276. sublist_element* next = t->next;
  277. delete t;
  278. t = next;
  279. } while (t != sublist->next);
  280. }
  281.  
  282. delete element_delete->sublist;
  283.  
  284. if (list->prev == list->next)
  285. {
  286. list->prev = list;
  287. list->next = list;
  288. }
  289. else
  290. {
  291. list_element* prev = element_delete->prev;
  292. list_element* next = element_delete->next;
  293. prev->next = next;
  294. next->prev = prev;
  295.  
  296. if (list->next == element_delete)
  297. list->next = element_delete->next;
  298. if (list->prev == element_delete)
  299. list->prev = element_delete->prev;
  300. }
  301.  
  302. delete element_delete;
  303. }
  304. }
  305.  
  306. void del_from_sublist(list_element* list)
  307. {
  308. cout << "Введите номер списка: ";
  309. int num = get_from_cin();
  310.  
  311. list_element* _list = search_list(list, num);
  312. if (_list == nullptr)
  313. cout << num << " не найден" << endl;
  314. else
  315. {
  316. sublist_element* sublist = _list->sublist;
  317.  
  318. if (isSublistEmpty(sublist))
  319. cout << "Подсписок пуст!" << endl;
  320. else
  321. {
  322. cout << "Введите значение для удаления: ";
  323. int to_delete = get_from_cin();
  324.  
  325. sublist_element* element_delete = search_sublist(sublist, to_delete);
  326. if (element_delete == nullptr)
  327. cout << to_delete << " не найден" << endl;
  328.  
  329. if (sublist->prev == sublist->next)
  330. {
  331. sublist->prev = sublist;
  332. sublist->next = sublist;
  333. }
  334. else
  335. {
  336. sublist_element* prev = element_delete->prev;
  337. sublist_element* next = element_delete->next;
  338. prev->next = next;
  339. next->prev = prev;
  340.  
  341. if (sublist->next == element_delete)
  342. sublist->next = element_delete->next;
  343. if (sublist->prev == element_delete)
  344. sublist->prev = element_delete->prev;
  345. }
  346.  
  347. delete element_delete;
  348. }
  349. }
  350. }
  351.  
  352.  
  353. void full_search(list_element* list)
  354. {
  355. if (list->prev == list && list->next == list)
  356. cout << "Список пуст!" << endl;
  357. else
  358. {
  359. cout << "Введите значение для поиска: ";
  360. int to_delete = get_from_cin();
  361.  
  362. list_element *t = list->next;
  363. do
  364. {
  365. if (search_sublist(t->sublist, to_delete) != nullptr)
  366. {
  367. system("cls");
  368. cout << to_delete << " найден" << endl;
  369. return;
  370. }
  371. t = t->next;
  372. } while (t != list->next);
  373.  
  374. system("cls");
  375. cout << to_delete << " не найден" << endl;
  376. }
  377. }
  378.  
  379.  
  380. int main()
  381. {
  382. setlocale(LC_ALL, "Rus");
  383. list_element* list = new list_element;
  384. list->next = list;
  385. list->prev = list;
  386.  
  387. int menu_point;
  388.  
  389. do {
  390. system("cls");
  391.  
  392. cout <<
  393. "1. Добавить в основной список" << endl <<
  394. "2. Добавить в подсписок" << endl <<
  395. "3. Удалить из основного списка" << endl <<
  396. "4. Удалить из подсписка " << endl <<
  397. "5. Найти элемент" << endl <<
  398. "6. Показать основной список" << endl <<
  399. "0. Выход" << endl;
  400. menu_point = get_from_cin();
  401.  
  402. system("cls");
  403.  
  404. switch (menu_point)
  405. {
  406. case 0:
  407. return 0;
  408. case 1:
  409. add_to_list(list);
  410. break;
  411. case 2:
  412. add_to_sublist(list);
  413. break;
  414. case 3:
  415. del_from_list(list);
  416. break;
  417. case 4:
  418. del_from_sublist(list);
  419. break;
  420. case 5:
  421. full_search(list);
  422. break;
  423. case 6:
  424. show(list);
  425. break;
  426. default:
  427. cout << "Ошибка ввода!" << endl;
  428. }
  429.  
  430. system("pause");
  431. } while (menu_point != 0);
  432.  
  433. return 0;
  434. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement