//(c)Terminator
#include <iostream>
using namespace std;
struct node {
int val;
node* next;
};
static void fill(node** lst, const int* fa, const int* la);
static void clear(node* lst);
static void remove_before(node** lst, bool (*pfn)(int));
bool func_un(int val){ return (val > 0); }
int main(void){
node* lst = NULL;
int a[] = { -10, -20, 30, 40 };
fill(&lst, a, a + sizeof(a)/sizeof(a[0]));
remove_before(&lst, func_un);
for(const node* i = lst; i != NULL; i = i->next)
cout << i->val << endl;
clear(lst);
return 0;
}
//заполнение списка массивом
static void fill(node** lst, const int* fa, const int* la){
node* h = NULL, *t = NULL;
while(fa != la){
node* p = new node();
p->next = NULL;
p->val = *fa++;
if(h == NULL)
h = t = p;
else {
t->next = p;
t = p;
}
}
*lst = h;
}
//чистка всего списка
static void clear(node* lst){
node* tmp;
while(lst != NULL){
tmp = lst;
lst = lst->next;
delete tmp;
}
}
//удаление элемента по компаратору
static void remove_before(node** lst, bool (*pfn)(int)){
node* p = *lst;
if(p != NULL){
while((p->next != NULL) && !(*pfn)(p->next->val)){
lst = &p->next;
p = p->next;
}
if(p->next != NULL){
*lst = p->next;
delete p;
}
}
}
Ci8vKGMpVGVybWluYXRvcgojaW5jbHVkZSA8aW9zdHJlYW0+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgoKc3RydWN0IG5vZGUgewoJaW50ICAgdmFsOwoJbm9kZSogbmV4dDsKfTsKCnN0YXRpYyB2b2lkIGZpbGwobm9kZSoqIGxzdCwgY29uc3QgaW50KiBmYSwgY29uc3QgaW50KiBsYSk7CnN0YXRpYyB2b2lkIGNsZWFyKG5vZGUqIGxzdCk7CnN0YXRpYyB2b2lkIHJlbW92ZV9iZWZvcmUobm9kZSoqIGxzdCwgYm9vbCAoKnBmbikoaW50KSk7CgoKYm9vbCAgZnVuY191bihpbnQgdmFsKXsgcmV0dXJuICh2YWwgPiAwKTsgfQoKCgppbnQgbWFpbih2b2lkKXsKCW5vZGUqIGxzdCA9IE5VTEw7CgoJaW50IGFbXSA9IHsgLTEwLCAtMjAsIDMwLCA0MCB9OwoJZmlsbCgmbHN0LCBhLCBhICsgc2l6ZW9mKGEpL3NpemVvZihhWzBdKSk7CglyZW1vdmVfYmVmb3JlKCZsc3QsIGZ1bmNfdW4pOwoKCWZvcihjb25zdCBub2RlKiBpID0gbHN0OyBpICE9IE5VTEw7IGkgPSBpLT5uZXh0KQoJCWNvdXQgPDwgaS0+dmFsIDw8IGVuZGw7CgoJY2xlYXIobHN0KTsKCXJldHVybiAwOwp9CgoKCgovL9C30LDQv9C+0LvQvdC10L3QuNC1INGB0L/QuNGB0LrQsCDQvNCw0YHRgdC40LLQvtC8CnN0YXRpYyB2b2lkIGZpbGwobm9kZSoqIGxzdCwgY29uc3QgaW50KiBmYSwgY29uc3QgaW50KiBsYSl7Cglub2RlKiBoID0gTlVMTCwgKnQgPSBOVUxMOwoKCXdoaWxlKGZhICE9IGxhKXsKCQlub2RlKiBwID0gbmV3IG5vZGUoKTsKCQlwLT5uZXh0ID0gTlVMTDsKCQlwLT52YWwgID0gKmZhKys7CgoJCWlmKGggPT0gTlVMTCkKCQkJaCA9IHQgPSBwOwoJCWVsc2UgewoJCQl0LT5uZXh0ID0gcDsKCQkJdCA9IHA7CgkJfQoJfQoJKmxzdCA9IGg7Cn0KCgoKLy/Rh9C40YHRgtC60LAg0LLRgdC10LPQviDRgdC/0LjRgdC60LAKc3RhdGljIHZvaWQgIGNsZWFyKG5vZGUqIGxzdCl7Cglub2RlKiB0bXA7Cgl3aGlsZShsc3QgIT0gTlVMTCl7CgkJdG1wID0gbHN0OwoJCWxzdCA9IGxzdC0+bmV4dDsKCQlkZWxldGUgdG1wOwoJfQp9CgoKCi8v0YPQtNCw0LvQtdC90LjQtSDRjdC70LXQvNC10L3RgtCwINC/0L4g0LrQvtC80L/QsNGA0LDRgtC+0YDRgwpzdGF0aWMgdm9pZCAgcmVtb3ZlX2JlZm9yZShub2RlKiogbHN0LCBib29sICgqcGZuKShpbnQpKXsKCW5vZGUqIHAgPSAqbHN0OwoKCWlmKHAgIT0gTlVMTCl7CgkJd2hpbGUoKHAtPm5leHQgIT0gTlVMTCkgJiYgISgqcGZuKShwLT5uZXh0LT52YWwpKXsKCQkJbHN0ID0gJnAtPm5leHQ7CgkJCXAgICA9IHAtPm5leHQ7CgkJfQoKCQlpZihwLT5uZXh0ICE9IE5VTEwpewoJCQkqbHN0ID0gcC0+bmV4dDsKCQkJZGVsZXRlIHA7CgkJfQoJfQp9