fork download
  1. #include <iostream>
  2.  
  3. struct Node {
  4. char key;
  5. Node *next;
  6. };
  7.  
  8. // ----------------------------------------------------------
  9. // Инициализация односвязанного списка из строки
  10. // ----------------------------------------------------------
  11.  
  12. Node* FuncInit(const std::string &iStr) {
  13. Node* Res = nullptr;
  14. Node* Cur = nullptr;
  15. for (const auto &i:iStr) {
  16. Node* Tmp = new Node({i,nullptr});
  17. if (Res) Cur->next = Tmp; else Res = Tmp;
  18. Cur = Tmp;
  19. }
  20. return Res;
  21. }
  22.  
  23. // ----------------------------------------------------------
  24. // Разрушение односвязанного списка
  25. // ----------------------------------------------------------
  26.  
  27. void FuncDestroy(Node* &iTop) {
  28. if (iTop) {
  29. Node *Tmp = iTop->next;
  30. FuncDestroy(Tmp);
  31. delete iTop;
  32. }
  33. iTop = nullptr;
  34. }
  35.  
  36. // ----------------------------------------------------------
  37. // Вставка символа в конец односвязанного списка
  38. // ----------------------------------------------------------
  39.  
  40. void FuncBackInsert(Node* &iTop, const char iChar) {
  41. Node* Res = iTop;
  42. Node* Tmp = new Node({iChar,nullptr});
  43. while(iTop && iTop->next) iTop=iTop->next;
  44. if (iTop) iTop->next = Tmp; else Res = Tmp;
  45. iTop = Res;
  46. }
  47.  
  48. // ----------------------------------------------------------
  49. // Удаление найденного символа из односвязанного списка
  50. // ----------------------------------------------------------
  51.  
  52. void FuncRemoveChar(Node* &iTop, const char iChar) {
  53. Node *Res = nullptr;
  54. Node *Prev = iTop;
  55. while(iTop) {
  56. if (iTop->key == iChar) {
  57. Prev->next = iTop->next;
  58. delete iTop;
  59. iTop = Prev;
  60. } else {
  61. if (!Res) Res = iTop;
  62. Prev = iTop;
  63. iTop = iTop->next;
  64. }
  65. }
  66. iTop = Res;
  67. }
  68.  
  69. // ----------------------------------------------------------
  70. // Печать односвязанного списка
  71. // ----------------------------------------------------------
  72.  
  73. void FuncPrint(Node* iTop) {
  74. while (iTop) {
  75. std::cout << iTop->key;
  76. iTop=iTop->next;
  77. }
  78. std::cout << std::endl;
  79. }
  80.  
  81. int main() {
  82. Node *Chain = FuncInit("MAMA MILA RAMU"); // инициализируем
  83. FuncPrint(Chain); // печатаем
  84. FuncBackInsert(Chain,'!'); // вставляем символ '!'
  85. FuncPrint(Chain); // печатаем
  86. FuncRemoveChar(Chain,'A'); // удаляем все вхождения 'A'
  87. FuncPrint(Chain); // печатаем
  88. FuncDestroy(Chain); // разрушаем оставшуюся структуру
  89. return 0;
  90. }
Success #stdin #stdout 0s 3472KB
stdin
Standard input is empty
stdout
MAMA MILA RAMU
MAMA MILA RAMU!
MM MIL RMU!