#include <iostream>
#include <string>
using namespace std;
template <typename T>
struct Element
{
T value;
Element *next;
Element(T v, Element *n) : value(v), next(n) {}
};
template <typename T>
void insert(Element<T> *&rp, T v, int (*eq)(T, T))
{
if (rp != NULL)
{
if (eq(rp->value, v) >= 0)
{
rp = new Element<T>(v, rp);
}
else
{
insert(rp->next, v, eq);
}
}
else
{
rp = new Element<T>(v, NULL);
}
}
template <typename T>
void remove(Element<T> *&rp, T v, int (*eq)(T, T))
{
if (rp != NULL)
{
if (eq(rp->value, v) == 0)
{ // v
Element<T> *tmp = rp;
rp = rp->next;
delete tmp;
remove(rp, v, eq);
}
else
{
remove(rp->next, v, eq);
}
}
}
template <typename T>
void print(Element<T> *p)
{
while (p)
{
cout << p->value << " ";
p = p->next;
}
cout << endl;
}
template <typename T>
int equal(T a, T b)
{
if (a < b)
return -1;
if (a > b)
return 1;
return 0;
}
int main()
{
int (*eq)(int, int) = equal;
Element<int> *head = NULL;
insert(head, 2, eq);
insert(head, 5, eq);
insert(head, 1, eq);
print(head);
remove(head, 2, eq);
print(head);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgRWxlbWVudAp7CiAgVCB2YWx1ZTsKICBFbGVtZW50ICpuZXh0OwoKICBFbGVtZW50KFQgdiwgRWxlbWVudCAqbikgOiB2YWx1ZSh2KSwgbmV4dChuKSB7fQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgaW5zZXJ0KEVsZW1lbnQ8VD4gKiZycCwgVCB2LCBpbnQgKCplcSkoVCwgVCkpCnsKICBpZiAocnAgIT0gTlVMTCkKICB7CiAgICBpZiAoZXEocnAtPnZhbHVlLCB2KSA+PSAwKQogICAgewogICAgICBycCA9IG5ldyBFbGVtZW50PFQ+KHYsIHJwKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgaW5zZXJ0KHJwLT5uZXh0LCB2LCBlcSk7CiAgICB9CiAgfQogIGVsc2UKICB7CiAgICBycCA9IG5ldyBFbGVtZW50PFQ+KHYsIE5VTEwpOwogIH0KfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgcmVtb3ZlKEVsZW1lbnQ8VD4gKiZycCwgVCB2LCBpbnQgKCplcSkoVCwgVCkpCnsKICBpZiAocnAgIT0gTlVMTCkKICB7CiAgICBpZiAoZXEocnAtPnZhbHVlLCB2KSA9PSAwKQogICAgeyAvLyB2CiAgICAgIEVsZW1lbnQ8VD4gKnRtcCA9IHJwOwogICAgICBycCA9IHJwLT5uZXh0OwogICAgICBkZWxldGUgdG1wOwogICAgICByZW1vdmUocnAsIHYsIGVxKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgcmVtb3ZlKHJwLT5uZXh0LCB2LCBlcSk7CiAgICB9CiAgfQp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kdm9pZCBwcmludChFbGVtZW50PFQ+ICpwKQp7CiAgd2hpbGUgKHApCiAgewogICAgY291dCA8PCBwLT52YWx1ZSA8PCAiICI7CiAgICBwID0gcC0+bmV4dDsKICB9CiAgY291dCA8PCBlbmRsOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KaW50IGVxdWFsKFQgYSwgVCBiKQp7CiAgaWYgKGEgPCBiKQogICAgcmV0dXJuIC0xOwogIGlmIChhID4gYikKICAgIHJldHVybiAxOwogIHJldHVybiAwOwp9CgppbnQgbWFpbigpCnsKICBpbnQgKCplcSkoaW50LCBpbnQpID0gZXF1YWw7CiAgRWxlbWVudDxpbnQ+ICpoZWFkID0gTlVMTDsKICBpbnNlcnQoaGVhZCwgMiwgZXEpOwogIGluc2VydChoZWFkLCA1LCBlcSk7CiAgaW5zZXJ0KGhlYWQsIDEsIGVxKTsKICBwcmludChoZWFkKTsKICByZW1vdmUoaGVhZCwgMiwgZXEpOwogIHByaW50KGhlYWQpOwp9Cg==