#include <iostream>
struct cnode {
char ch;
cnode* next;
};
struct clist {
cnode* head;
cnode* tail;
};
void clist_init(clist* lst);
bool clist_add(clist* lst, char ch);
void clist_println(std::ostream& _out, const clist* lst);
void clist_clear(clist* lst);
//удаление символа(ов) - fch, перед символом - lch
void clist_delete(clist* lst, char fch, char lch){
cnode* p, *a, *b, *t, *prev;
if(lst->head == NULL)
return;
p = lst->head;
do {
if(p->ch == fch){
b = p;
do {
if(b->next->ch == lch){
b = b->next;
break;
}
b = b->next;
} while((b != lst->head) && (b->ch == fch));
if(b->ch == lch){
a = p;
if(p == lst->head){
lst->head = b;
lst->tail->next = b;
} else {
if(b == lst->head){
lst->tail = prev;
lst->tail->next = lst->head;
} else
prev->next = b;
}
while(a != b){
t = a;
a = a->next;
delete t;
}
p = prev = b;
}
}
prev = p;
p = p->next;
} while(p != lst->head);
}
int main(void){
clist lst;
clist_init(&lst);
char s[] = "EEENENEEEEEEN, [EEEN] <EN>EEENEE";
for(const char* p = &s[0]; *p; ++p)
clist_add(&lst, *p);
clist_println(std::cout, &lst);
clist_delete(&lst, 'E', 'N');
clist_println(std::cout, &lst);
clist_clear(&lst);
return 0;
}
//инициализация кольцевого-списка
void clist_init(clist* lst){
lst->head = lst->tail = NULL;
}
//добавление в конец кольцевого-списка
bool clist_add(clist* lst, char ch){
cnode* p = new (std::nothrow) cnode();
if(p != NULL){
p->ch = ch;
if(lst->head == NULL){
p->next = p;
lst->head = lst->tail = p;
} else {
p->next = lst->head;
lst->tail->next = p;
lst->tail = p;
}
}
return (p != NULL);
}
//вывод кольцевого-списка в выходной поток
void clist_println(std::ostream& _out, const clist* lst){
const cnode* p, *e;
if(lst->head != NULL){
p = e = lst->head;
do {
_out << p->ch;
p = p->next;
} while(p != e);
_out << std::endl;
}
}
//уадление кольцевого-списка
void clist_clear(clist* lst){
cnode* t, *e, *p;
if(lst->head != NULL){
p = e = lst->head;
do {
t = p;
p = p->next;
delete t;
} while(p != e);
lst->head = lst->tail = NULL;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IGNub2RlIHsKCWNoYXIgICBjaDsKCWNub2RlKiBuZXh0Owp9OwoKc3RydWN0IGNsaXN0IHsKCWNub2RlKiBoZWFkOwoJY25vZGUqIHRhaWw7Cn07Cgp2b2lkIGNsaXN0X2luaXQoY2xpc3QqIGxzdCk7CmJvb2wgY2xpc3RfYWRkKGNsaXN0KiBsc3QsIGNoYXIgY2gpOwp2b2lkIGNsaXN0X3ByaW50bG4oc3RkOjpvc3RyZWFtJiBfb3V0LCBjb25zdCBjbGlzdCogbHN0KTsKdm9pZCBjbGlzdF9jbGVhcihjbGlzdCogbHN0KTsKCi8v0YPQtNCw0LvQtdC90LjQtSDRgdC40LzQstC+0LvQsCjQvtCyKSAtIGZjaCwg0L/QtdGA0LXQtCDRgdC40LzQstC+0LvQvtC8IC0gbGNoCnZvaWQgY2xpc3RfZGVsZXRlKGNsaXN0KiBsc3QsIGNoYXIgZmNoLCBjaGFyIGxjaCl7Cgljbm9kZSogcCwgKmEsICpiLCAqdCwgKnByZXY7CglpZihsc3QtPmhlYWQgPT0gTlVMTCkKCQlyZXR1cm47CgoJcCA9IGxzdC0+aGVhZDsKCWRvIHsJCgkJaWYocC0+Y2ggPT0gZmNoKXsKCQkJYiA9IHA7CgkJCWRvIHsKCQkJCWlmKGItPm5leHQtPmNoID09IGxjaCl7CgkJCQkJYiA9IGItPm5leHQ7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCQliID0gYi0+bmV4dDsKCQkJfSB3aGlsZSgoYiAhPSBsc3QtPmhlYWQpICYmIChiLT5jaCA9PSBmY2gpKTsKCgkJCWlmKGItPmNoID09IGxjaCl7CgkJCQlhID0gcDsKCQkJCWlmKHAgPT0gbHN0LT5oZWFkKXsKCQkJCQlsc3QtPmhlYWQgPSBiOwoJCQkJCWxzdC0+dGFpbC0+bmV4dCA9IGI7CgkJCQl9IGVsc2UgewoJCQkJCWlmKGIgPT0gbHN0LT5oZWFkKXsKCQkJCQkJbHN0LT50YWlsID0gcHJldjsKCQkJCQkJbHN0LT50YWlsLT5uZXh0ID0gbHN0LT5oZWFkOwoJCQkJCX0gZWxzZQoJCQkJCQlwcmV2LT5uZXh0ID0gYjsKCQkJCX0KCgkJCQl3aGlsZShhICE9IGIpewoJCQkJCXQgPSBhOwoJCQkJCWEgPSBhLT5uZXh0OwoJCQkJCWRlbGV0ZSB0OwoJCQkJfQoJCQkJcCA9IHByZXYgPSBiOwoJCQl9CgkJfQoJCXByZXYgPSBwOwoJCXAgICAgPSBwLT5uZXh0OwoJfSB3aGlsZShwICE9IGxzdC0+aGVhZCk7Cn0KCgppbnQgbWFpbih2b2lkKXsKCWNsaXN0IGxzdDsKCWNsaXN0X2luaXQoJmxzdCk7CgoJY2hhciBzW10gPSAiRUVFTkVORUVFRUVFTiwgW0VFRU5dIDxFTj5FRUVORUUiOwoJZm9yKGNvbnN0IGNoYXIqIHAgPSAmc1swXTsgKnA7ICsrcCkKCQljbGlzdF9hZGQoJmxzdCwgKnApOwoKCWNsaXN0X3ByaW50bG4oc3RkOjpjb3V0LCAmbHN0KTsKCWNsaXN0X2RlbGV0ZSgmbHN0LCAnRScsICdOJyk7CgljbGlzdF9wcmludGxuKHN0ZDo6Y291dCwgJmxzdCk7CgoJY2xpc3RfY2xlYXIoJmxzdCk7CglyZXR1cm4gMDsKfQoKLy/QuNC90LjRhtC40LDQu9C40LfQsNGG0LjRjyDQutC+0LvRjNGG0LXQstC+0LPQvi3RgdC/0LjRgdC60LAKdm9pZCBjbGlzdF9pbml0KGNsaXN0KiBsc3QpewoJbHN0LT5oZWFkID0gbHN0LT50YWlsID0gTlVMTDsJCn0KCi8v0LTQvtCx0LDQstC70LXQvdC40LUg0LIg0LrQvtC90LXRhiDQutC+0LvRjNGG0LXQstC+0LPQvi3RgdC/0LjRgdC60LAKYm9vbCBjbGlzdF9hZGQoY2xpc3QqIGxzdCwgY2hhciBjaCl7Cgljbm9kZSogcCA9IG5ldyAoc3RkOjpub3Rocm93KSBjbm9kZSgpOwoJaWYocCAhPSBOVUxMKXsKCQlwLT5jaCA9IGNoOwoJCWlmKGxzdC0+aGVhZCA9PSBOVUxMKXsKCQkJcC0+bmV4dCAgID0gcDsKCQkJbHN0LT5oZWFkID0gbHN0LT50YWlsID0gcDsKCQl9IGVsc2UgewoJCQlwLT5uZXh0ID0gbHN0LT5oZWFkOwoJCQlsc3QtPnRhaWwtPm5leHQgPSBwOwoJCQlsc3QtPnRhaWwgPSBwOwoJCX0KCX0KCXJldHVybiAocCAhPSBOVUxMKTsKfQoKLy/QstGL0LLQvtC0INC60L7Qu9GM0YbQtdCy0L7Qs9C+LdGB0L/QuNGB0LrQsCDQsiDQstGL0YXQvtC00L3QvtC5INC/0L7RgtC+0LoKdm9pZCBjbGlzdF9wcmludGxuKHN0ZDo6b3N0cmVhbSYgX291dCwgY29uc3QgY2xpc3QqIGxzdCl7Cgljb25zdCBjbm9kZSogcCwgKmU7CglpZihsc3QtPmhlYWQgIT0gTlVMTCl7CgkJcCA9IGUgPSBsc3QtPmhlYWQ7CgkJZG8gewoJCQlfb3V0IDw8IHAtPmNoOwoJCQlwID0gcC0+bmV4dDsKCQl9IHdoaWxlKHAgIT0gZSk7CgkJX291dCA8PCBzdGQ6OmVuZGw7Cgl9Cn0KCi8v0YPQsNC00LvQtdC90LjQtSDQutC+0LvRjNGG0LXQstC+0LPQvi3RgdC/0LjRgdC60LAKdm9pZCBjbGlzdF9jbGVhcihjbGlzdCogbHN0KXsKCWNub2RlKiB0LCAqZSwgKnA7CglpZihsc3QtPmhlYWQgIT0gTlVMTCl7CgkJcCA9IGUgPSBsc3QtPmhlYWQ7CgkJZG8gewoJCQl0ID0gcDsKCQkJcCA9IHAtPm5leHQ7CgkJCWRlbGV0ZSB0OwoJCX0gd2hpbGUocCAhPSBlKTsKCQlsc3QtPmhlYWQgPSBsc3QtPnRhaWwgPSBOVUxMOwoJfQp9