#include <iostream>
struct Node {
char key;
Node *next;
};
// ----------------------------------------------------------
// Инициализация односвязанного списка из строки
// ----------------------------------------------------------
Node* FuncInit(const std::string &iStr) {
Node* Res = nullptr;
Node* Cur = nullptr;
for (const auto &i:iStr) {
Node* Tmp = new Node({i,nullptr});
if (Res) Cur->next = Tmp; else Res = Tmp;
Cur = Tmp;
}
return Res;
}
// ----------------------------------------------------------
// Разрушение односвязанного списка
// ----------------------------------------------------------
void FuncDestroy(Node* &iTop) {
if (iTop) {
Node *Tmp = iTop->next;
FuncDestroy(Tmp);
delete iTop;
}
iTop = nullptr;
}
// ----------------------------------------------------------
// Вставка символа в конец односвязанного списка
// ----------------------------------------------------------
void FuncBackInsert(Node* &iTop, const char iChar) {
Node* Res = iTop;
Node* Tmp = new Node({iChar,nullptr});
while(iTop && iTop->next) iTop=iTop->next;
if (iTop) iTop->next = Tmp; else Res = Tmp;
iTop = Res;
}
// ----------------------------------------------------------
// Удаление найденного символа из односвязанного списка
// ----------------------------------------------------------
void FuncRemoveChar(Node* &iTop, const char iChar) {
Node *Res = nullptr;
Node *Prev = iTop;
while(iTop) {
if (iTop->key == iChar) {
Prev->next = iTop->next;
delete iTop;
iTop = Prev;
} else {
if (!Res) Res = iTop;
Prev = iTop;
iTop = iTop->next;
}
}
iTop = Res;
}
// ----------------------------------------------------------
// Печать односвязанного списка
// ----------------------------------------------------------
void FuncPrint(Node* iTop) {
while (iTop) {
std::cout << iTop->key;
iTop=iTop->next;
}
std::cout << std::endl;
}
int main() {
Node *Chain = FuncInit("MAMA MILA RAMU"); // инициализируем
FuncPrint(Chain); // печатаем
FuncBackInsert(Chain,'!'); // вставляем символ '!'
FuncPrint(Chain); // печатаем
FuncRemoveChar(Chain,'A'); // удаляем все вхождения 'A'
FuncPrint(Chain); // печатаем
FuncDestroy(Chain); // разрушаем оставшуюся структуру
return 0;
}