fork download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. struct ilist // Создание списочной структуры
  5. {
  6. float num; // Объявление переменной
  7. ilist *next; // Указатель на следующей список
  8. };
  9. ilist* find_pos(ilist *&il, int k); // Инициализация функции поиска позиции k
  10. // Добавление (вставка) элемента в начало списка
  11. void insert_begin(ilist *&il, float k)
  12. {
  13. ilist *r = new ilist;
  14. r->num = k;
  15. r->next=il;
  16. il=r;
  17. }
  18. // Удаление первого элемента: второй становится началом
  19. float del_begin(ilist *&il)
  20. {
  21. ilist *r=il;
  22. float x=r->num;
  23. il=r->next;
  24. return x;
  25. }
  26. // Вставка или добавление элемента в середину списка
  27. float insert_middle(ilist *&il, int k, float nm)
  28. {
  29. ilist* lst = find_pos(il, k-1); // Элемент списка распологается перед местом вставки
  30. ilist* lst1 = lst-> next; // Элемент списка распологается после места вставки
  31. ilist* tmpList = new ilist; // Создаётся новый элемент списка
  32. tmpList->num = nm;
  33. tmpList->next = lst1;
  34. lst->next = tmpList;
  35. return(0);
  36. }
  37. // Удаление элемента из середины списка
  38. float del_middle(ilist *&il, int k)
  39. {
  40. if(k<=1) // Если k=1, то происходит удаление первого элемента
  41. {
  42. del_begin(il);
  43. return(0);
  44. }
  45. ilist* lst = find_pos(il, k - 1); // Последний элемент помещается перед удаляемым
  46. ilist* lst1 = lst -> next; // Удаляемый элемент
  47. float x = lst1->num;
  48. lst1 = lst1->next; // Определение следующего после удаляемого
  49. lst->next = lst1; // Он делается следующим вместо удаляемого
  50. return(x);
  51. }
  52. // Вставка или добавление элемента в конец списка
  53. float ins_end(ilist *&il, float nm)
  54. {
  55. ilist* lst = il;
  56. while (lst->next) // Отыскание последнего элемента
  57. lst = lst->next;
  58. ilist* lst1 = new ilist; // Создание вставляемого элемента
  59. lst1->num = nm;
  60. lst1->next = NULL;
  61. lst->next = lst1; // Его вставка
  62. return(0);
  63. }
  64. // Удаление последнего элемента с конца списка
  65. float del_end(ilist *&il)
  66. {
  67. ilist* lst = il;
  68. ilist* lst1 = il;
  69. while (lst->next) // Отыскание последнего и предпоследнего элементов
  70. {
  71. lst1 = lst;
  72. lst = lst->next;
  73. }
  74. lst1->next = NULL; // Предпоследний элемент списка делается последним
  75. float x=lst->num;
  76. return(x);
  77. }
  78. // Поиск элемента с данным номером
  79. ilist* find_pos(ilist *&il, int k)
  80. {
  81. ilist* lst = il;
  82. for (int i = 1; i<k; i++)
  83. lst = lst->next;
  84. return(lst);
  85. }
  86. // Печать списка
  87. float print_list(ilist *&lst)
  88. {
  89. if(!lst) return(0);
  90. cout << lst->num << " ";
  91. ilist* nlst;
  92. nlst=lst->next;
  93. while (nlst)
  94. {
  95. float k=nlst->num;
  96. cout << k << " ";
  97. nlst=nlst->next;
  98. }
  99. cout << endl;
  100. return(0);
  101. }
  102. // Ввод вещественного(ых) числа(ел)
  103. float ninp()
  104. {
  105. float n;
  106. cout << "Введите вещественное число - ";
  107. cin >> n;
  108. return(n);
  109. }
  110. // Ввод списка
  111. ilist* linp()
  112. {
  113. ilist* lst = NULL;
  114. float n;
  115. cout << "Введите список вещественных чисел через пробел. Для окончания введите";
  116. cout << " введите отрицательное число.";
  117. cin >> n;
  118. while (n>=0.f)
  119. {
  120. insert_begin(lst, n);
  121. cin >> n;
  122. }
  123. return(lst);
  124. }
  125. // Удаление всех элементов равных данному
  126. float del_all(ilist *&il, float n)
  127. {
  128. ilist* lst;
  129. if (il->next == NULL) // Если элемент последний, то
  130. {
  131. if (il->num == n) // в случае, когда он равен n
  132. il = NULL; // он удаляется
  133. return(0);
  134. }
  135. if (il->num == n) // Если n – первый, он выбрасывается
  136. il = il -> next;
  137. lst = il->next;
  138. del_all(lst, n); // Операция повторяется рекурсивно с хвостом
  139. il->next = lst; // списка и он присоединяется к началу
  140. return(0.f);
  141. }
  142. int main()
  143. {
  144. int n, k;
  145. float num;
  146. ilist* lst = NULL;
  147.  
  148. // Меню программы
  149. cout << "1. Создать список." << endl;
  150. cout << "2. Добавить элемент." << endl;
  151. cout << "3. Удалить элемент из начала." << endl;
  152. cout << "4. Добавить элемент в позицию k." << endl;
  153. cout << "5. Удалить элемент из позиции k." << endl;
  154. cout << "6. Добавить элемент в конец ." << endl;
  155. cout << "7. Удалить элемент в конце ." << endl;
  156. cout << "8. Печать списка." << endl;
  157. cout << "9. Удаление всех элементов равных данному." << endl;
  158. cout << "10. Выход." << endl;
  159. // Часть экрана (окно) для вывода результатов window(WL, WT+10, WR, WB);
  160. // Выполнение операций над списком
  161. while(1)
  162. {
  163. cout << "Введите номер действия - ";
  164. cin >> n;
  165. switch(n)
  166. {
  167. case 1:
  168. lst=linp();
  169. break;
  170. case 2:
  171. num = ninp();
  172. insert_begin(lst, num);
  173. break;
  174. case 3:
  175. del_begin(lst);
  176. break;
  177. case 4:
  178. cout << "Введите номер позиции ";
  179. cin >> k;
  180. num = ninp();
  181. insert_middle(lst, k, num);
  182. break;
  183. case 5:
  184. cout << "Введите номер позиции ";
  185. cin >> k;
  186. cout << endl << " Удаляется " << find_pos(lst,
  187. k)->num << endl;
  188. del_middle(lst, k);
  189. break;
  190. case 6:
  191. num = ninp();
  192. ins_end(lst, num);
  193. break;
  194. case 7:
  195. del_end(lst);
  196. break;
  197. case 8:
  198. break;
  199. case 9:
  200. num = ninp();
  201. del_all(lst, num);
  202. break;
  203. default:
  204. return(0);
  205. }
  206. print_list(lst);
  207. }
  208. }
  209.  
Success #stdin #stdout 0s 3036KB
stdin
1
1 2 3 4 5 -1
2
6
8
10
stdout
1. Создать список.
2. Добавить элемент.
3. Удалить элемент из начала.
4. Добавить элемент в позицию k.
5. Удалить элемент из позиции k.
6. Добавить элемент в конец .
7. Удалить элемент в конце .
8. Печать списка.
9. Удаление всех элементов равных данному.
10. Выход.
Введите номер действия - Введите список вещественных чисел через пробел. Для окончания введите введите отрицательное число.5    4    3    2    1    
Введите номер действия - Введите вещественное число - 6    5    4    3    2    1    
Введите номер действия - 6    5    4    3    2    1    
Введите номер действия -