#include <iostream>
#include <string>
template<typename T>
struct snode {
T val;
snode* next;
};
template<typename T>
class sorted_list {
typedef snode<T> node;
private:
node* lst;
size_t cnt;
public:
sorted_list(void):lst(NULL), cnt(0){}
~sorted_list(){
this->clear();
}
public:
//вставка
bool add(const T& val){
node* prv = lst, *ptr = lst;
while(ptr != NULL){
if(val < ptr->val)
break;
else {
if(val == ptr->val)
break;
}
prv = ptr;
ptr = ptr->next;
}
node* p = new (std::nothrow) node();
if(p != NULL){
p->val = val;
if(ptr == lst){
p->next = lst;
lst = p;
} else {
p->next = ptr;
prv->next = p;
}
++cnt;
}
return (p != NULL);
}
//удаление по текущей позиции
node* erase(node* pos){
node* prv = lst, *ptr = lst;
while((ptr != pos) && (ptr != NULL)){
prv = ptr;
ptr = ptr->next;
}
if(ptr == NULL)
return pos;
else if(ptr == lst)
prv = lst = lst->next;
else {
prv->next = ptr->next;
prv = prv->next;
}
--cnt;
delete pos;
return prv;
}
//удаление всех
void clear(void){
node* tmp;
while(lst != NULL){
tmp = lst;
lst = lst->next;
delete tmp;
}
}
node* begin(void) { return lst; }
node* begin(void) const { return lst; }
bool empty(void) const { return (lst == NULL); }
size_t size(void) const { return cnt; }
};
//персона
struct person {
std::string name;
std::string city;
int age;
person(void){}
person(const char* _name, const char* _city, int _age):
name(_name), city(_city), age(_age){}
bool operator == (const person& p) const {
return (name == p.name);
}
bool operator < (const person& p) const {
return (name < p.name);
}
};
int main(void){
sorted_list<person> lp;
lp.add( person("Вася", "Самара", 38) );
lp.add( person("Петя", "Киров", 42) );
lp.add( person("Лёха", "Орёл", 30) );
lp.add( person("Витя", "Томск", 27) );
lp.add( person("Саня", "Курган", 33) );
lp.add( person("Толя", "Курск", 45) );
lp.add( person("Стёпа", "Якутск", 31) );
snode<person>* p = lp.begin();
while(p != NULL){ // удалить всех старше 40-ка лет
if(p->val.age > 40){
p = lp.erase(p);
continue;
}
p = p->next;
}
for(p = lp.begin(); p != NULL; p = p->next){
std::cout << "имя: \t" << p->val.name << std::endl;
std::cout << "город: \t" << p->val.city << std::endl;
std::cout << "возраст: " << p->val.age << std::endl << std::endl;
}
lp.clear();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IHNub2RlIHsKCVQgICAgICB2YWw7Cglzbm9kZSogbmV4dDsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIHNvcnRlZF9saXN0IHsKCXR5cGVkZWYgc25vZGU8VD4gbm9kZTsKcHJpdmF0ZToKCW5vZGUqICBsc3Q7CglzaXplX3QgY250OwpwdWJsaWM6Cglzb3J0ZWRfbGlzdCh2b2lkKTpsc3QoTlVMTCksIGNudCgwKXt9Cgl+c29ydGVkX2xpc3QoKXsKCQl0aGlzLT5jbGVhcigpOwoJfQpwdWJsaWM6CgkKCS8v0LLRgdGC0LDQstC60LAKCWJvb2wgYWRkKGNvbnN0IFQmIHZhbCl7CgkJbm9kZSogcHJ2ID0gbHN0LCAqcHRyID0gbHN0OwoKCQl3aGlsZShwdHIgIT0gTlVMTCl7CgkJCWlmKHZhbCA8IHB0ci0+dmFsKQoJCQkJYnJlYWs7CgkJCWVsc2UgewoJCQkJaWYodmFsID09IHB0ci0+dmFsKQoJCQkJCWJyZWFrOwoJCQl9CgkJCXBydiA9IHB0cjsKCQkJcHRyID0gcHRyLT5uZXh0OwoJCX0KCgkJbm9kZSogcCA9IG5ldyAoc3RkOjpub3Rocm93KSBub2RlKCk7CgkJaWYocCAhPSBOVUxMKXsKCQkJcC0+dmFsID0gdmFsOwoKCQkJaWYocHRyID09IGxzdCl7CgkJCQlwLT5uZXh0ID0gbHN0OwoJCQkJbHN0ICAgICA9IHA7CgkJCX0gZWxzZSB7CgkJCQlwLT5uZXh0ICAgPSBwdHI7CgkJCQlwcnYtPm5leHQgPSBwOwoJCQl9CgkJCSsrY250OwoJCX0KCQlyZXR1cm4gKHAgIT0gTlVMTCk7Cgl9CgoJLy/Rg9C00LDQu9C10L3QuNC1INC/0L4g0YLQtdC60YPRidC10Lkg0L/QvtC30LjRhtC40LgKCW5vZGUqIGVyYXNlKG5vZGUqIHBvcyl7CgkJbm9kZSogcHJ2ID0gbHN0LCAqcHRyID0gbHN0OwoJCXdoaWxlKChwdHIgIT0gcG9zKSAmJiAocHRyICE9IE5VTEwpKXsKCQkJcHJ2ID0gcHRyOwoJCQlwdHIgPSBwdHItPm5leHQ7CgkJfQoKCQlpZihwdHIgPT0gTlVMTCkKCQkJcmV0dXJuIHBvczsKCQllbHNlIGlmKHB0ciA9PSBsc3QpCgkJCXBydiA9IGxzdCA9IGxzdC0+bmV4dDsKCQllbHNlIHsKCQkJcHJ2LT5uZXh0ID0gcHRyLT5uZXh0OwoJCQlwcnYgPSBwcnYtPm5leHQ7CgkJfQoJCS0tY250OwoJCWRlbGV0ZSBwb3M7CgkJcmV0dXJuIHBydjsKCX0KCgkvL9GD0LTQsNC70LXQvdC40LUg0LLRgdC10YUKCXZvaWQgY2xlYXIodm9pZCl7CgkJbm9kZSogdG1wOwoJCXdoaWxlKGxzdCAhPSBOVUxMKXsKCQkJdG1wID0gbHN0OwoJCQlsc3QgPSBsc3QtPm5leHQ7CgkJCWRlbGV0ZSB0bXA7CgkJfQoJfQoKCW5vZGUqICBiZWdpbih2b2lkKSB7IHJldHVybiBsc3Q7IH0KCW5vZGUqICBiZWdpbih2b2lkKSBjb25zdCB7IHJldHVybiBsc3Q7IH0KCWJvb2wgICBlbXB0eSh2b2lkKSBjb25zdCB7IHJldHVybiAobHN0ID09IE5VTEwpOyB9CglzaXplX3Qgc2l6ZSh2b2lkKSAgY29uc3QgeyByZXR1cm4gY250OyB9Cn07CgovL9C/0LXRgNGB0L7QvdCwCnN0cnVjdCBwZXJzb24gewoJc3RkOjpzdHJpbmcgbmFtZTsKCXN0ZDo6c3RyaW5nIGNpdHk7CglpbnQgICAgICAgICBhZ2U7CgoJcGVyc29uKHZvaWQpe30KCXBlcnNvbihjb25zdCBjaGFyKiBfbmFtZSwgY29uc3QgY2hhciogX2NpdHksIGludCBfYWdlKToKCW5hbWUoX25hbWUpLCBjaXR5KF9jaXR5KSwgYWdlKF9hZ2Upe30KCglib29sIG9wZXJhdG9yID09IChjb25zdCBwZXJzb24mIHApIGNvbnN0IHsKCQlyZXR1cm4gKG5hbWUgPT0gcC5uYW1lKTsKCX0KCglib29sIG9wZXJhdG9yIDwgKGNvbnN0IHBlcnNvbiYgcCkgY29uc3QgewoJCXJldHVybiAobmFtZSA8IHAubmFtZSk7Cgl9Cn07CgoKaW50IG1haW4odm9pZCl7Cglzb3J0ZWRfbGlzdDxwZXJzb24+IGxwOwoJbHAuYWRkKCBwZXJzb24oItCS0LDRgdGPIiwgICLQodCw0LzQsNGA0LAiLCAzOCkgKTsKCWxwLmFkZCggcGVyc29uKCLQn9C10YLRjyIsICAi0JrQuNGA0L7QsiIsICA0MikgKTsKCWxwLmFkZCggcGVyc29uKCLQm9GR0YXQsCIsICAi0J7RgNGR0LsiLCAgIDMwKSApOwoJbHAuYWRkKCBwZXJzb24oItCS0LjRgtGPIiwgICLQotC+0LzRgdC6IiwgIDI3KSApOwoJbHAuYWRkKCBwZXJzb24oItCh0LDQvdGPIiwgICLQmtGD0YDQs9Cw0L0iLCAzMykgKTsKCWxwLmFkZCggcGVyc29uKCLQotC+0LvRjyIsICAi0JrRg9GA0YHQuiIsICA0NSkgKTsKCWxwLmFkZCggcGVyc29uKCLQodGC0ZHQv9CwIiwgItCv0LrRg9GC0YHQuiIsIDMxKSApOwoKCXNub2RlPHBlcnNvbj4qIHAgPSBscC5iZWdpbigpOwoJd2hpbGUocCAhPSBOVUxMKXsgLy8g0YPQtNCw0LvQuNGC0Ywg0LLRgdC10YUg0YHRgtCw0YDRiNC1IDQwLdC60LAg0LvQtdGCCgkJaWYocC0+dmFsLmFnZSA+IDQwKXsKCQkJcCA9IGxwLmVyYXNlKHApOwoJCQljb250aW51ZTsKCQl9CgkJcCA9IHAtPm5leHQ7Cgl9CgoJZm9yKHAgPSBscC5iZWdpbigpOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KXsKCQlzdGQ6OmNvdXQgPDwgItC40LzRjzogXHQiICAgPDwgcC0+dmFsLm5hbWUgPDwgc3RkOjplbmRsOwoJCXN0ZDo6Y291dCA8PCAi0LPQvtGA0L7QtDogXHQiIDw8IHAtPnZhbC5jaXR5IDw8IHN0ZDo6ZW5kbDsKCQlzdGQ6OmNvdXQgPDwgItCy0L7Qt9GA0LDRgdGCOiAiIDw8IHAtPnZhbC5hZ2UgIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7Cgl9CglscC5jbGVhcigpOwoJcmV0dXJuIDA7Cn0K