Advertisement
Sanlover

Untitled

Oct 18th, 2020
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.83 KB | None | 0 0
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <Windows.h>
  4.  
  5. using namespace std;
  6.  
  7. struct List
  8. {
  9. int Value;
  10. List* pNext;
  11. };
  12.  
  13. List* head;
  14.  
  15. void Initial();
  16. bool isEmpty();
  17. List* Search(int);
  18. List* SearchPrev(int);
  19. void AddAfter(int);
  20. void AddBefore(int);
  21. void DeleteBefore(int);
  22. void DeleteAfter(int);
  23. void DeleteAll();
  24. void Output();
  25.  
  26. int main()
  27. {
  28. int q;
  29.  
  30. do
  31. {
  32. SetConsoleOutputCP(1251);
  33. SetConsoleCP(1251);
  34.  
  35. cout << "Выберите действие:" << endl;
  36. cout << "1. Ввести элементы списка" << endl;
  37. cout << "2. Проверить список на пустоту" << endl;
  38. cout << "3. Найти элемент с заданным значением" << endl;
  39. cout << "4. Добавить элемент до элемента с заданным значением" << endl;
  40. cout << "5. Добавить элемент после элемента с заданным значением" << endl;
  41. cout << "6. Удалить элемент до элемента с заданным значением" << endl;
  42. cout << "7. Удалить элемент после элемента с заданным значением" << endl;
  43. cout << "8. Удалить список" << endl;
  44. cout << "9. Вывести список" << endl;
  45. cout << "0. Выход" << endl;
  46.  
  47. cin >> q;
  48.  
  49. if (q == 1)
  50. {
  51. Initial();
  52. }
  53. else if (q == 2)
  54. {
  55. if (isEmpty() == 0)
  56. cout << "Список не пустой" << endl;
  57. else cout << "Список пустой" << endl;
  58. }
  59. else if (q == 3)
  60. {
  61. int num;
  62. cout << "Введите искомое значение:" << endl;
  63. cin >> num;
  64. cout << Search(num) << endl;
  65. }
  66. else if (q == 4)
  67. {
  68. int num;
  69. cout << "Введите искомое значение:" << endl;
  70. cin >> num;
  71. AddAfter(num);
  72. }
  73. else if (q == 5)
  74. {
  75. int num;
  76. cout << "Введите искомое значение:" << endl;
  77. cin >> num;
  78. AddBefore(num);
  79. }
  80. else if (q == 6)
  81. {
  82. int num;
  83. cout << "Введите искомое значение:" << endl;
  84. cin >> num;
  85. DeleteAfter(num);
  86. }
  87. else if (q == 7)
  88. {
  89. int num;
  90. cout << "Введите искомое значение:" << endl;
  91. cin >> num;
  92. DeleteBefore(num);
  93. }
  94. else if (q == 8)
  95. DeleteAll();
  96. else if (q == 9)
  97. Output();
  98. } while (q != 0);
  99. }
  100.  
  101. void Initial()
  102. {
  103. head = new List;
  104. head->Value = 0;//head выполняет роль счётчик элементов
  105.  
  106. List* tmp = head;
  107. tmp->pNext = nullptr;
  108.  
  109. int elem;
  110.  
  111. cout << "Введите элементы списка:" << endl;
  112. cin >> elem;
  113. while (elem != 0)
  114. {
  115. tmp->pNext = new List;
  116. tmp = tmp->pNext;
  117. tmp->Value = elem;
  118. head->Value++;
  119. tmp->pNext = nullptr;
  120. cin >> elem;
  121. }
  122. }
  123.  
  124. bool isEmpty()
  125. {
  126. return head == nullptr;
  127. }
  128.  
  129. List* Search(int num)//функция выводит адрес элемента с заданным значением
  130. {
  131. List* tmp = head->pNext;
  132.  
  133. while (tmp != nullptr && tmp->Value != num)
  134. {
  135. tmp = tmp->pNext;
  136. }
  137.  
  138. if (tmp == nullptr)
  139. cout << "Такого элемента нет в списке" << endl;
  140.  
  141. return tmp;
  142. }
  143.  
  144. List* SearchPrev(int num)//функция выводит адрес элемента находящего перед элементом с заданным значением
  145. {
  146. List* tmp = head;
  147.  
  148. while (tmp->pNext != nullptr)
  149. {
  150. if (tmp->pNext->Value == num)
  151. return tmp;
  152. tmp = tmp->pNext;
  153. }
  154.  
  155. cout << "Такого элемента нет в списке" << endl;
  156.  
  157. return nullptr;
  158. }
  159.  
  160. void AddAfter(int num)
  161. {
  162. List* prev = SearchPrev(num), * tmp = prev, * tmp2 = new List;
  163.  
  164. if (tmp != nullptr)
  165. {
  166. cout << "Введите значение для нового элемента:" << endl;
  167. cin >> tmp2->Value;
  168. tmp2->pNext = tmp->pNext;
  169. tmp->pNext = tmp2;
  170. head->Value++;
  171. }
  172. }
  173.  
  174. void AddBefore(int num)
  175. {
  176. List* elem = Search(num), * tmp = elem;
  177.  
  178. if (tmp != nullptr && tmp->pNext == nullptr)//когда нужно добавить в конец списка
  179. {
  180. tmp->pNext = new List;
  181. tmp->pNext->pNext = nullptr;
  182. cout << "Введите значение для нового элемента:" << endl;
  183. cin >> tmp->pNext->Value;
  184. head->Value++;
  185. }
  186. else if (tmp != nullptr)
  187. {
  188. List* tmp2 = new List;
  189.  
  190. cout << "Введите значение для нового элемента:" << endl;
  191. cin >> tmp2->Value;
  192. tmp2->pNext = tmp->pNext;
  193. tmp->pNext = tmp2;
  194. head->Value++;
  195. }
  196. }
  197.  
  198. void DeleteBefore(int num)
  199. {
  200. List* elem = Search(num), * tmp = elem->pNext;
  201.  
  202. if (elem != nullptr && tmp == nullptr)
  203. cout << "Нельзя удалить элемент следующий за последним" << endl;
  204. else if (elem != nullptr && tmp->pNext == nullptr)//для последнего элемента
  205. {
  206. delete tmp;
  207. elem->pNext = nullptr;
  208. head->Value--;
  209. }
  210. else if (elem != nullptr && tmp != nullptr)
  211. {
  212. elem->pNext = elem->pNext->pNext;
  213. delete tmp;
  214. head->Value--;
  215. }
  216. }
  217.  
  218. void DeleteAfter(int num)
  219. {
  220. List* elem = SearchPrev(num), * tmp;
  221.  
  222. if (elem == head)
  223. cout << "Нельзя удалить элемент перед первым элементом" << endl;
  224. else if (elem != nullptr)
  225. {
  226. List* tmp2 = head;//tmp2 элемент перед предыдущим
  227. while (tmp2->pNext != elem)
  228. {
  229. tmp2 = tmp2->pNext;
  230. }
  231. tmp = elem;
  232. tmp2->pNext = elem->pNext;
  233. delete tmp;
  234. head->Value--;
  235. }
  236. }
  237.  
  238. void DeleteAll()
  239. {
  240. List* tmp;
  241. while (head->pNext != nullptr)
  242. {
  243. tmp = head->pNext;
  244. head->pNext = tmp->pNext;
  245. delete tmp;
  246. head->Value--;
  247. }
  248. }
  249.  
  250. void Output()
  251. {
  252. List* tmp = head;
  253. cout << "Вывод списка:" << endl;
  254. for (tmp; tmp != nullptr; tmp = tmp->pNext)
  255. cout << tmp->Value << '\t';
  256. cout << endl;
  257. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement