#include <iostream>
struct slist {
char ch;
slist* next;
};
void slist_copy(slist*& lst, const char* str);
void slist_println(std::ostream& _out, const slist* p);
void slist_clear(slist* lst);
//удаление символа-fch перед символом-lch
void slist_remove(slist*& lst, char fch, char lch){
slist* p, *a, *t, **rv = &lst;
for(p = lst; (p != NULL) && (p->next != NULL); ){
if(p->ch == fch){
while((p != NULL) && (p->ch == fch))
p = p->next;
if((p != NULL) && (p->ch == lch)){
a = *rv;
if(p == lst)
*rv = lst = lst->next;
else
*rv = p;
while(a != p){
t = a;
a = a->next;
delete t;
}
continue;
} else if(p == NULL)
break;
}
rv = &p->next;
p = p->next;
}
}
int main(void){
slist* lst = NULL;
char s[] = "pa (pppa) [papp] <ppppapppppa> ppppppppppppaapa";
slist_copy(lst, s);
slist_println(std::cout, lst);
slist_remove(lst, 'p', 'a');
slist_println(std::cout, lst);
slist_clear(lst);
return 0;
}
//копирование строки в список
void slist_copy(slist*& lst, const char* str){
slist* p, *tail = NULL;
for(lst = NULL; *str; ++str){
p = new (std::nothrow)slist();
if(p == NULL)
break;
p->ch = *str;
p->next = NULL;
if(lst == NULL)
lst = tail = p;
else {
tail->next = p;
tail = p;
}
}
}
//печать
void slist_println(std::ostream& _out, const slist* p){
for(; p != NULL; p = p->next)
_out << p->ch;
_out << std::endl;
}
//удаление всех
void slist_clear(slist* lst){
slist* tmp;
while(lst != NULL){
tmp = lst;
lst = lst->next;
delete tmp;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IHNsaXN0IHsKCWNoYXIgICBjaDsKCXNsaXN0KiBuZXh0Owp9OwoKdm9pZCBzbGlzdF9jb3B5KHNsaXN0KiYgbHN0LCBjb25zdCBjaGFyKiBzdHIpOwp2b2lkIHNsaXN0X3ByaW50bG4oc3RkOjpvc3RyZWFtJiBfb3V0LCBjb25zdCBzbGlzdCogcCk7CnZvaWQgc2xpc3RfY2xlYXIoc2xpc3QqIGxzdCk7CgovL9GD0LTQsNC70LXQvdC40LUg0YHQuNC80LLQvtC70LAtZmNoINC/0LXRgNC10LQg0YHQuNC80LLQvtC70L7QvC1sY2gKdm9pZCBzbGlzdF9yZW1vdmUoc2xpc3QqJiBsc3QsIGNoYXIgZmNoLCBjaGFyIGxjaCl7CglzbGlzdCogcCwgKmEsICp0LCAqKnJ2ID0gJmxzdDsKCglmb3IocCA9IGxzdDsgKHAgIT0gTlVMTCkgJiYgKHAtPm5leHQgIT0gTlVMTCk7ICl7CgoJCWlmKHAtPmNoID09IGZjaCl7CgkJCXdoaWxlKChwICE9IE5VTEwpICYmIChwLT5jaCA9PSBmY2gpKQoJCQkJcCA9IHAtPm5leHQ7CgkJCgkJCWlmKChwICE9IE5VTEwpICYmIChwLT5jaCA9PSBsY2gpKXsKCQkJCWEgPSAqcnY7CgkJCQlpZihwID09IGxzdCkKCQkJCQkqcnYgPSBsc3QgPSBsc3QtPm5leHQ7CgkJCQllbHNlCgkJCQkJKnJ2ID0gcDsKCgkJCQl3aGlsZShhICE9IHApewoJCQkJCXQgPSBhOwoJCQkJCWEgPSBhLT5uZXh0OwoJCQkJCWRlbGV0ZSB0OwoJCQkJfQoJCQkJY29udGludWU7CgkJCX0gZWxzZSBpZihwID09IE5VTEwpCgkJCQlicmVhazsKCQl9CgkJcnYgPSAmcC0+bmV4dDsKCQlwICA9IHAtPm5leHQ7Cgl9Cn0KCgppbnQgbWFpbih2b2lkKXsKCXNsaXN0KiBsc3QgPSBOVUxMOwoKCWNoYXIgc1tdID0gInBhIChwcHBhKSBbcGFwcF0gPHBwcHBhcHBwcHBhPiBwcHBwcHBwcHBwcHBhYXBhIjsKCXNsaXN0X2NvcHkobHN0LCBzKTsKCglzbGlzdF9wcmludGxuKHN0ZDo6Y291dCwgbHN0KTsKCXNsaXN0X3JlbW92ZShsc3QsICdwJywgJ2EnKTsKCXNsaXN0X3ByaW50bG4oc3RkOjpjb3V0LCBsc3QpOwoKCXNsaXN0X2NsZWFyKGxzdCk7CglyZXR1cm4gMDsKfQoKLy/QutC+0L/QuNGA0L7QstCw0L3QuNC1INGB0YLRgNC+0LrQuCDQsiDRgdC/0LjRgdC+0LoKdm9pZCBzbGlzdF9jb3B5KHNsaXN0KiYgbHN0LCBjb25zdCBjaGFyKiBzdHIpewoJc2xpc3QqIHAsICp0YWlsID0gTlVMTDsKCWZvcihsc3QgPSBOVUxMOyAqc3RyOyArK3N0cil7CgkJcCA9IG5ldyAoc3RkOjpub3Rocm93KXNsaXN0KCk7CgkJaWYocCA9PSBOVUxMKQoJCQlicmVhazsKCgkJcC0+Y2ggICA9ICpzdHI7CgkJcC0+bmV4dCA9IE5VTEw7CgoJCWlmKGxzdCA9PSBOVUxMKQoJCQlsc3QgPSB0YWlsID0gcDsKCQllbHNlIHsKCQkJdGFpbC0+bmV4dCA9IHA7CgkJCXRhaWwgPSBwOwoJCX0KCX0KfQoKLy/Qv9C10YfQsNGC0YwKdm9pZCBzbGlzdF9wcmludGxuKHN0ZDo6b3N0cmVhbSYgX291dCwgY29uc3Qgc2xpc3QqIHApewoJZm9yKDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKCQlfb3V0IDw8IHAtPmNoOwoJX291dCA8PCBzdGQ6OmVuZGw7Cn0KCi8v0YPQtNCw0LvQtdC90LjQtSDQstGB0LXRhQp2b2lkIHNsaXN0X2NsZWFyKHNsaXN0KiBsc3QpewoJc2xpc3QqIHRtcDsKCXdoaWxlKGxzdCAhPSBOVUxMKXsKCQl0bXAgPSBsc3Q7CgkJbHN0ID0gbHN0LT5uZXh0OwoJCWRlbGV0ZSB0bXA7Cgl9Cn0=