Advertisement
Guest User

Untitled

a guest
Dec 5th, 2016
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.75 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <string.h>
  5.  
  6. struct _str
  7. {
  8. char ch;
  9. struct _str *next;
  10. };
  11.  
  12. typedef struct _str str;
  13.  
  14. str *m_head = 0, *m_curr = 0;
  15. int is_allowed = 0;
  16.  
  17. void get_started();
  18. void empty_list();
  19. void is_empty();
  20. void set_curr_ptr_to_head_ptr();
  21. void is_last_node();
  22. void next_node();
  23. void print_value();
  24. void remove_current_node();
  25. void cut_out_node();
  26. void change_value();
  27. void add_new_node();
  28. void print_struct();
  29. void shutdown();
  30.  
  31. int _is_empty();
  32.  
  33. void get_started()
  34. {
  35. fflush(stdin);
  36. system("cls");
  37.  
  38. if (!is_allowed)
  39. {
  40. char pw[50];
  41. int size;
  42.  
  43. printf("Введите пароль.\n");
  44. printf("> ");
  45.  
  46. fgets(pw, 50, stdin);
  47. size = strlen(pw);
  48. pw[size - 1] = '\0';
  49.  
  50. if (!strcmp(pw, "laba4"))
  51. {
  52. is_allowed = 1;
  53.  
  54. printf("Пароль корректный, можете приступить к работе.\n");
  55. printf("Для продолжения нажмите любую клавишу.\n");
  56. getch();
  57. }
  58. else
  59. {
  60. printf("Неверный пароль. Попробуйте еще раз.\n");
  61. printf("Для продолжения нажмите любую клавишу.\n");
  62. getch();
  63. }
  64. }
  65. else
  66. {
  67. printf("Работа со списком уже начата. Для начала новой работы, ее сперва необходимо закончить.\n");
  68. printf("Для продолжения нажмите любую клавишу.\n");
  69. getch();
  70. }
  71. }
  72.  
  73. void empty_list()
  74. {
  75. system("cls");
  76.  
  77. if (is_allowed)
  78. {
  79. if (m_head)
  80. {
  81. str *tmp;
  82.  
  83. while (m_head != 0)
  84. {
  85. tmp = m_head;
  86. m_head = m_head->next;
  87. free(tmp);
  88. }
  89.  
  90. m_head = 0;
  91. m_curr = 0;
  92.  
  93. printf("Список был успешно очищен.\n");
  94. printf("Для продолжения нажмите любую клавишу.\n");
  95. getch();
  96. }
  97. else
  98. {
  99. printf("Список уже пуст.\n");
  100. printf("Для продолжения нажмите любую клавишу.\n");
  101. getch();
  102. }
  103. }
  104. else
  105. {
  106. printf("Для выполнения этого действия необходимо выполнить пункт 1 (начать работу со списком).\n");
  107. printf("Для продолжения нажмите любую клавишу.\n");
  108. getch();
  109. }
  110.  
  111. }
  112.  
  113. void is_empty()
  114. {
  115. system("cls");
  116.  
  117. if (is_allowed)
  118. {
  119. if (m_head == 0)
  120. {
  121. printf("Список пуст.\n");
  122. printf("Для продолжения нажмите любую клавишу.\n");
  123. getch();
  124. }
  125. else
  126. {
  127. printf("Список не пуст.\n");
  128. printf("Для продолжения нажмите любую клавишу.\n");
  129. getch();
  130. }
  131. }
  132. else
  133. {
  134. printf("Для выполнения этого действия необходимо выполнить пункт 1 (начать работу со списком).\n");
  135. printf("Для продолжения нажмите любую клавишу.\n");
  136. getch();
  137. }
  138.  
  139. }
  140.  
  141. void set_curr_ptr_to_head_ptr()
  142. {
  143. system("cls");
  144.  
  145. if (is_allowed)
  146. {
  147. if (m_head)
  148. {
  149. m_curr = m_head;
  150.  
  151. printf("Рабочий указатель установлен в начало списка.\n");
  152. printf("Для продолжения нажмите любую клавишу.\n");
  153. getch();
  154. }
  155. else
  156. {
  157. printf("Невозможно установить рабочий указатель в начало списка т.к. список пуст.\n");
  158. printf("Для продолжения нажмите любую клавишу.\n");
  159. getch();
  160. }
  161. }
  162. else
  163. {
  164. printf("Для выполнения этого действия необходимо выполнить пункт 1 (начать работу со списком).\n");
  165. printf("Для продолжения нажмите любую клавишу.\n");
  166. getch();
  167. }
  168. }
  169.  
  170. void is_last_node()
  171. {
  172. system("cls");
  173.  
  174. if (is_allowed)
  175. {
  176. if (m_curr)
  177. {
  178. if (m_curr->next == 0)
  179. {
  180. printf("Рабочий указатель находится в конце списка.\n");
  181. printf("Для продолжения нажмите любую клавишу.\n");
  182. getch();
  183. }
  184. else
  185. {
  186. printf("Рабочий указатель не находится в конце списка.\n");
  187. printf("Для продолжения нажмите любую клавишу.\n");
  188. getch();
  189. }
  190. }
  191. else
  192. {
  193. printf("Список не существует.\n");
  194. printf("Для продолжения нажмите любую клавишу.\n");
  195. getch();
  196. }
  197. }
  198. else
  199. {
  200. printf("Для выполнения этого действия необходимо выполнить пункт 1 (начать работу со списком).\n");
  201. printf("Для продолжения нажмите любую клавишу.\n");
  202. getch();
  203. }
  204. }
  205.  
  206. void next_node()
  207. {
  208. system("cls");
  209.  
  210. if (is_allowed)
  211. {
  212. if (m_curr && m_curr->next != 0)
  213. {
  214. m_curr = m_curr->next;
  215.  
  216. printf("Рабочий указатель успешно передвинут вперед.\n");
  217. printf("Для продолжения нажмите любую клавишу.\n");
  218. getch();
  219. }
  220. else
  221. {
  222. printf("Рабочий указатель не был передвинут вперед, т.к. он уже указывает на конец списка.\n");
  223. printf("Для продолжения нажмите любую клавишу.\n");
  224. getch();
  225. }
  226. }
  227. else
  228. {
  229. printf("Для выполнения этого действия необходимо выполнить пункт 1 (начать работу со списком).\n");
  230. printf("Для продолжения нажмите любую клавишу.\n");
  231. getch();
  232. }
  233. }
  234.  
  235. void print_value()
  236. {
  237. system("cls");
  238.  
  239. if (is_allowed)
  240. {
  241. if(m_head!=0)
  242. {
  243. if (m_curr->next)
  244. {
  245. printf("Значение элемента за указателем: \'%c\'\n", m_curr->next->ch);
  246. printf("Для продолжения нажмите любую клавишу.\n");
  247. getch();
  248. }
  249. else
  250. {
  251. printf("Элементов за указателем нет.\n");
  252. printf("Для продолжения нажмите любую клавишу.\n");
  253. getch();
  254. }
  255. }
  256. else
  257. {
  258. printf("Список пуст\n");
  259. printf("Для продолжения нажмите любую клавишу.\n");
  260. getch();
  261.  
  262. }
  263. }
  264. else
  265. {
  266. printf("Для выполнения этого действия необходимо выполнить пункт 1 (начать работу со списком).\n");
  267. printf("Для продолжения нажмите любую клавишу.\n");
  268. getch();
  269. }
  270.  
  271. }
  272.  
  273. void remove_current_node()
  274. {
  275. str *tmp;
  276. system("cls");
  277.  
  278.  
  279. if (is_allowed)
  280. {
  281. if (m_head && m_curr)
  282. {
  283. if (m_curr == m_head && m_head->next == 0)
  284. {
  285. printf("За указателем ничего нет, нечего удалять.\n");
  286. printf("Для продолжения нажмите любую клавишу.\n");
  287. getch();
  288. }
  289. else
  290. {
  291. if (m_curr->next == 0)
  292. {
  293. printf("За указателем ничего нет, нечего удалять.\n");
  294. printf("Для продолжения нажмите любую клавишу.\n");
  295. getch();
  296. }
  297. else
  298. {
  299. if (m_curr->next->next != 0)
  300. {
  301. tmp = m_curr->next->next;
  302. free(m_curr->next);
  303. m_curr->next = tmp;
  304. }
  305. else
  306. {
  307. free(m_curr->next);
  308. m_curr->next = 0;
  309. }
  310.  
  311. printf("Элемент успешно удален.\n");
  312. printf("Для продолжения нажмите любую клавишу.\n");
  313. getch();
  314. }
  315. }
  316. }
  317. else
  318. {
  319. printf("Невозможно удалить текущий элемент, т.к. список не существует.\n");
  320. printf("Перед тем как удалить что-то, нужно сначала что-то добавить.\n");
  321. printf("Для продолжения нажмите любую клавишу.\n");
  322. getch();
  323. }
  324. }
  325. else
  326. {
  327. printf("Для выполнения этого действия необходимо выполнить пункт 1 (начать работу со списком).\n");
  328. printf("Для продолжения нажмите любую клавишу.\n");
  329. getch();
  330. }
  331. }
  332.  
  333. void cut_out_node()
  334. {
  335. system("cls");
  336.  
  337. if (is_allowed)
  338. {
  339. if (m_head && m_curr)
  340. {
  341. str *tmp;
  342. char c;
  343.  
  344. if (m_curr->next == 0)
  345. {
  346. printf("Невозможно взять элемент за указателем, т.к за рабочем указателем ничего нет.\n");
  347. printf("Для продолжения нажмите любую клавишу.\n");
  348. getch();
  349. }
  350. else
  351. {
  352. if (m_curr->next->next == 0)
  353. {
  354. c = m_curr->next->ch;
  355. free(m_curr->next);
  356. m_curr->next = 0;
  357. }
  358. else
  359. {
  360. tmp = m_curr->next->next;
  361. c = m_curr->next->ch;
  362. free(m_curr->next);
  363. m_curr->next = tmp;
  364. }
  365.  
  366.  
  367. printf("Вырезанный элемент: \'%c\'\n", c);
  368. printf("Для продолжения нажмите любую клавишу.\n");
  369. getch();
  370. }
  371. }
  372. else
  373. {
  374. printf("Невозможно взять текущий элемент, т.к. списка не существует.\n");
  375. printf("Перед тем как взять что-то, нужно сначала что-то добавить.\n");
  376. printf("Для продолжения нажмите любую клавишу.\n");
  377. getch();
  378. }
  379. }
  380. else
  381. {
  382. printf("Для выполнения этого действия необходимо выполнить пункт 1 (начать работу со списком).\n");
  383. printf("Для продолжения нажмите любую клавишу.\n");
  384. getch();
  385. }
  386. }
  387.  
  388. void change_value()
  389. {
  390. system("cls");
  391.  
  392. if (is_allowed)
  393. {
  394. if (m_head && m_curr)
  395. {
  396. if (m_curr->next == 0)
  397. {
  398. printf("Невозможно изменить значение за указателем, т.к. за рабочем указателем ничего нет.\n");
  399. printf("Для продолжения нажмите любую клавишу.\n");
  400. getch();
  401. }
  402. else
  403. {
  404. printf("Текущее значение элемента: \'%c\'.\n", m_curr->next->ch);
  405. printf("Новое значение элемета:\n");
  406. printf("> ");
  407.  
  408. m_curr->next->ch = getchar();
  409.  
  410. printf("\n");
  411. printf("Для продолжения нажмите любую клавишу.\n");
  412. getch();
  413. }
  414. }
  415. else
  416. {
  417. printf("Невозможно изменить значение за указателем, т.к. списка не существует.\n");
  418. printf("Для продолжения нажмите любую клавишу.\n");
  419. getch();
  420. }
  421. }
  422. else
  423. {
  424. printf("Для выполнения этого действия необходимо выполнить пункт 1 (начать работу со списком).\n");
  425. printf("Для продолжения нажмите любую клавишу.\n");
  426. getch();
  427. }
  428. }
  429.  
  430. void add_new_node()
  431. {
  432. system("cls");
  433.  
  434. if (is_allowed)
  435. {
  436. str *tmp = 0;
  437. str *buf = 0;
  438.  
  439. printf("Введите символ: \n");
  440. printf("> ");
  441.  
  442. if (m_head == 0 && m_curr == 0)
  443. {
  444. m_head = (str *)malloc(sizeof(str));
  445.  
  446. if(m_head)
  447. {
  448. m_curr = m_head;
  449. m_curr->next = 0;
  450. m_curr->ch = getchar();
  451. }
  452. }
  453. else
  454. {
  455. if (m_curr->next != 0)
  456. tmp = m_curr->next;
  457.  
  458. m_curr->next = (str *)malloc(sizeof(str));
  459.  
  460. if(m_curr->next != 0)
  461. {
  462. // m_curr = m_curr->next;
  463. m_curr->next->next = tmp;
  464. m_curr->next->ch = getchar();
  465. }
  466. }
  467. }
  468. else
  469. {
  470. printf("Для выполнения этого действия необходимо выполнить пункт 1 (начать работу со списком).\n");
  471. printf("Для продолжения нажмите любую клавишу.\n");
  472. getch();
  473. }
  474. }
  475.  
  476. void print_struct()
  477. {
  478. system("cls");
  479.  
  480. if (is_allowed)
  481. {
  482. if (m_head)
  483. {
  484. str *tmp = m_head;
  485.  
  486. printf("Текущая структура данных: ");
  487. while (tmp != 0)
  488. {
  489. if (tmp == m_curr)
  490. printf("%c* ", tmp->ch);
  491. else
  492. printf("%c ", tmp->ch);
  493.  
  494. tmp = tmp->next;
  495. }
  496. printf("\n* текущее положение рабочего указателя.\n\n");
  497. printf("Для продолжения нажмите любую клавишу.\n");
  498. getch();
  499. }
  500. else
  501. {
  502. printf("Невозможно распечатать структуру, т.к. она пуста.\n");
  503. printf("Для продолжения нажмите любую клавишу.\n");
  504. getch();
  505. }
  506. }
  507. else
  508. {
  509. printf("Для выполнения этого действия необходимо выполнить пункт 1 (начать работу со списком).\n");
  510. printf("Для продолжения нажмите любую клавишу.\n");
  511. getch();
  512. }
  513.  
  514. }
  515.  
  516. void shutdown()
  517. {
  518. system("cls");
  519.  
  520. if (is_allowed)
  521. {
  522. if (m_head)
  523. {
  524. str *tmp;
  525.  
  526. while (m_head != 0)
  527. {
  528. tmp = m_head;
  529. m_head = m_head->next;
  530. free(tmp);
  531. }
  532.  
  533. m_head = 0; m_curr = 0; is_allowed = 0;
  534. }
  535. else
  536. {
  537. printf("Невозможно освободить память, т.к. структура пуста.\n");
  538. printf("Для продолжения нажмите любую клавишу.\n");
  539. getch();
  540. }
  541. }
  542. else
  543. {
  544. printf("Для выполнения этого действия необходимо выполнить пункт 1 (начать работу со списком).\n");
  545. printf("Для продолжения нажмите любую клавишу.\n");
  546. getch();
  547. }
  548. }
  549.  
  550. void menu()
  551. {
  552. int input;
  553.  
  554. do
  555. {
  556. system("cls");
  557.  
  558. printf(" [ Меню ]\n");
  559. printf(" 1| Начать работу со списком\n");
  560. printf(" 2| Сделать список пустым\n");
  561. printf(" 3| Проверить пуст ли список\n");
  562. printf(" 4| Установить рабочий указатель начало списка\n");
  563. printf(" 5| Проверить стоит ли рабочий указатель в конце списка\n");
  564. printf(" 6| Передвинуть рабочий указатель списка вперед\n");
  565. printf(" 7| Показать значение элемента списка за указателем\n");
  566. printf(" 8| Удалить элемент списка за указателем\n");
  567. printf(" 9| Взять элемент списка за указателем\n");
  568. printf("10| Изменить значение элемента списка за указателем\n");
  569. printf("11| Добавить элемент за указателем\n");
  570. printf("12| Распечатать структуру данных\n");
  571. printf("13| Закончить работу со списком\n");
  572. printf(" 0| Выйти\n\n");
  573.  
  574. printf(" [ Ввод ]\n");
  575. printf("> ");
  576. scanf("%d", &input);
  577.  
  578. fflush(stdin);
  579.  
  580. switch (input)
  581. {
  582. case 1:
  583. get_started();
  584. break;
  585. case 2:
  586. empty_list();
  587. break;
  588. case 3:
  589. is_empty();
  590. break;
  591. case 4:
  592. set_curr_ptr_to_head_ptr();
  593. break;
  594. case 5:
  595. is_last_node();
  596. break;
  597. case 6:
  598. next_node();
  599. break;
  600. case 7:
  601. print_value();
  602. break;
  603. case 8:
  604. remove_current_node();
  605. break;
  606. case 9:
  607. cut_out_node();
  608. break;
  609. case 10:
  610. change_value();
  611. break;
  612. case 11:
  613. add_new_node();
  614. break;
  615. case 12:
  616. print_struct();
  617. break;
  618. case 13:
  619. shutdown();
  620. break;
  621. default:
  622. printf("Символ введен не из списка\n");
  623. getch();
  624. break;
  625. }
  626. }
  627. while (input != 0);
  628. }
  629.  
  630. int main(int argc, char *argv[])
  631. {
  632. system("chcp 65001");
  633. system("cls");
  634.  
  635. menu();
  636.  
  637. return 0;
  638. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement