fork(1) download
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. class uzel
  5. {
  6. private:
  7. int dannye;
  8. uzel* u_sled;
  9. uzel* u_pred;
  10. public:
  11. friend class spisok;
  12. };
  13. class spisok
  14. {
  15. private:
  16. uzel* u_golova;
  17. uzel* u_hvost;
  18. public:
  19. spisok(): u_golova(NULL), u_hvost(NULL) {}
  20. //Создаём новый узел списка
  21. void push(int znach)
  22. {
  23. uzel* u_NovUzel = new uzel;
  24. u_NovUzel->dannye = znach;
  25. if (u_golova != NULL) u_golova->u_pred = u_NovUzel;
  26. u_NovUzel->u_pred = NULL;
  27. u_NovUzel->u_sled = u_golova;
  28. if (u_NovUzel->u_sled == NULL) u_hvost = u_NovUzel;
  29. u_golova = u_NovUzel;
  30. }
  31. //Вывод списка начиная с головы
  32. void print()
  33. {
  34. uzel* u_TekUzel = u_golova;
  35. while (u_TekUzel)
  36. {
  37. cout << u_TekUzel->dannye << endl;
  38. u_TekUzel = u_TekUzel->u_sled;
  39. }
  40. }
  41. //Инверсия списка
  42. void invert()
  43. {
  44. uzel* u_TekUzel = u_golova;
  45. int KolVoUzlov = NULL;
  46. while (u_TekUzel)
  47. {
  48. ++KolVoUzlov;
  49. u_TekUzel = u_TekUzel->u_sled;
  50. }
  51. u_TekUzel = u_golova;
  52. uzel* u_PredUzel = u_hvost;
  53. while (KolVoUzlov > 1)
  54. {
  55. int a = NULL;
  56. a = u_TekUzel->dannye;
  57. u_TekUzel->dannye = u_PredUzel->dannye;
  58. u_PredUzel->dannye = a;
  59. u_TekUzel = u_TekUzel->u_sled;
  60. u_PredUzel = u_PredUzel->u_pred;
  61. KolVoUzlov -= 2;
  62. }
  63. }
  64. //Удаление узлов с заданным содержимым
  65. void del(int znach)
  66. {
  67. uzel* u_TekUzel = u_golova;
  68. while (u_TekUzel) //Удаление серединных узлов
  69. {
  70. if (u_TekUzel->dannye == znach)
  71. {
  72. uzel* u_SledZam = u_TekUzel->u_sled;
  73. uzel* u_PredZam = u_TekUzel->u_pred;
  74. if (u_TekUzel->u_sled != NULL && u_TekUzel->u_pred != NULL)
  75. {
  76. u_TekUzel->u_pred->u_sled = u_TekUzel->u_sled;
  77. u_TekUzel->u_sled->u_pred = u_TekUzel->u_pred;
  78. delete u_TekUzel;
  79. u_TekUzel = u_PredZam;
  80. }
  81. }
  82. u_TekUzel = u_TekUzel->u_sled;
  83. }
  84. u_TekUzel = u_golova; //Возврат указателя головы списка к началу
  85. if (u_TekUzel->dannye == znach && u_golova != u_hvost) //Удаление первого элемента
  86. {
  87. u_TekUzel->u_sled->u_pred = NULL;
  88. u_golova = u_TekUzel->u_sled;
  89. delete u_TekUzel;
  90. }
  91. u_TekUzel = u_hvost; //Берём указатель на хвост
  92. if (u_TekUzel->dannye == znach && u_golova != u_hvost)
  93. {
  94. u_TekUzel->u_pred->u_sled = NULL;
  95. u_hvost = u_TekUzel->u_pred;
  96. delete u_TekUzel;
  97. u_TekUzel = u_hvost;
  98. }
  99. if (u_TekUzel->dannye == znach && u_golova == u_hvost)
  100. {
  101. delete u_TekUzel;
  102. u_golova = NULL;
  103. u_hvost == NULL;
  104. }
  105.  
  106. }
  107. ~spisok(){}
  108. };
  109. int main()
  110. {
  111. spisok stek;
  112. string vvod = "&";
  113. setlocale(LC_ALL, "Russian");
  114. cout << "push [значение] — ввод целого числа в список. Не вводите символы, в том числе пробел!" << endl;
  115. cout << "del [значение] — удалить узлы списка с заданным значением" << endl;
  116. cout << "print — вывести список на экран" << endl;
  117. cout << "invert — инвертировать список" << endl << endl;
  118. while (vvod != "exit")
  119. {
  120. int znach;
  121. cin >> vvod;
  122. if (vvod == "push") { cin >> znach; stek.push(znach); }
  123. if (vvod == "print") stek.print();
  124. if (vvod == "invert") stek.invert();
  125. if (vvod == "del") { cin >> znach; stek.del(znach); }
  126.  
  127. }
  128. }
Time limit exceeded #stdin #stdout 5s 4528KB
stdin
Standard input is empty
stdout
push [значение] — ввод целого числа в список. Не вводите символы, в том числе пробел!
del [значение] — удалить узлы списка с заданным значением
print — вывести список на экран
invert — инвертировать список