#include <iostream>
struct list {
int inf;
list* next;
list* prev;
};
bool list_add(list*& head, list*& tail, int inf);
void list_clear(list*& head, list*& tail);
//удаление дубликатов
void list_unique(list*& head, list*& tail){
list* p1, *p2, *t;
for(p1 = head; p1 != NULL; ){
for(p2 = p1->next; p2 != NULL; ){
if(p2->inf == p1->inf){
t = p2;
if(p2 == tail){
tail = tail->prev;
p2 = tail->next = NULL;
} else {
p2->next->prev = p2->prev;
p2->prev->next = p2->next;
p2 = t->next;
}
delete t;
continue;
}
p2 = p2->next;
}
p1 = p1->next;
}
}
int main(void){
list* head = NULL, *tail = NULL;
for(int i = 0; i < 10; ++i){
for(int j = 0; j < 10; ++j)
list_add(head, tail, j);
}
list_unique(head, tail);
const list* p;
for(p = head; p != NULL; p = p->next)
std::cout << p->inf << ' ';
std::cout << std::endl;
for(p = tail; p != NULL; p = p->prev)
std::cout << p->inf << ' ';
std::cout << std::endl;
list_clear(head, tail);
return 0;
}
//добавление элемента в конец списка
bool list_add(list*& head, list*& tail, int inf){
list* p = new (std::nothrow) list();
if(p != NULL){
p->inf = inf;
p->next = p->prev = NULL;
if(head == NULL)
head = tail = p;
else {
tail->next = p;
p->prev = tail;
tail = p;
}
}
return (p != NULL);
}
//удаление всех
void list_clear(list*& head, list*& tail){
list* t;
while(head != NULL){
t = head;
head = head->next;
delete t;
}
tail = NULL;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IGxpc3QgewoJaW50ICAgaW5mOwoJbGlzdCogbmV4dDsKCWxpc3QqIHByZXY7Cn07Cgpib29sIGxpc3RfYWRkKGxpc3QqJiBoZWFkLCBsaXN0KiYgdGFpbCwgaW50IGluZik7CnZvaWQgbGlzdF9jbGVhcihsaXN0KiYgaGVhZCwgbGlzdComIHRhaWwpOwoKLy/Rg9C00LDQu9C10L3QuNC1INC00YPQsdC70LjQutCw0YLQvtCyCnZvaWQgbGlzdF91bmlxdWUobGlzdComIGhlYWQsIGxpc3QqJiB0YWlsKXsKCWxpc3QqIHAxLCAqcDIsICp0OwoJZm9yKHAxID0gaGVhZDsgcDEgIT0gTlVMTDsgKXsKCQlmb3IocDIgPSBwMS0+bmV4dDsgcDIgIT0gTlVMTDsgKXsKCQkJaWYocDItPmluZiA9PSBwMS0+aW5mKXsKCQkJCXQgPSBwMjsKCQkJCWlmKHAyID09IHRhaWwpewoJCQkJCXRhaWwgPSB0YWlsLT5wcmV2OwoJCQkJCXAyICAgPSB0YWlsLT5uZXh0ID0gTlVMTDsKCQkJCX0gZWxzZSB7CgkJCQkJcDItPm5leHQtPnByZXYgPSBwMi0+cHJldjsKCQkJCQlwMi0+cHJldi0+bmV4dCA9IHAyLT5uZXh0OwoJCQkJCXAyID0gdC0+bmV4dDsKCQkJCX0KCQkJCWRlbGV0ZSB0OwoJCQkJY29udGludWU7CgkJCX0KCQkJcDIgPSBwMi0+bmV4dDsKCQl9CgkJcDEgPSBwMS0+bmV4dDsKCX0KfQoKCmludCBtYWluKHZvaWQpewoJbGlzdCogaGVhZCA9IE5VTEwsICp0YWlsID0gTlVMTDsKCglmb3IoaW50IGkgPSAwOyBpIDwgMTA7ICsraSl7CgkJZm9yKGludCBqID0gMDsgaiA8IDEwOyArK2opCgkJCWxpc3RfYWRkKGhlYWQsIHRhaWwsIGopOwoJfQoKCWxpc3RfdW5pcXVlKGhlYWQsIHRhaWwpOwoKCWNvbnN0IGxpc3QqIHA7Cglmb3IocCA9IGhlYWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCgkJc3RkOjpjb3V0IDw8IHAtPmluZiA8PCAnICc7CglzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwoKCWZvcihwID0gdGFpbDsgcCAhPSBOVUxMOyBwID0gcC0+cHJldikKCQlzdGQ6OmNvdXQgPDwgcC0+aW5mIDw8ICcgJzsKCXN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CgoJbGlzdF9jbGVhcihoZWFkLCB0YWlsKTsKCXJldHVybiAwOwp9CgoKLy/QtNC+0LHQsNCy0LvQtdC90LjQtSDRjdC70LXQvNC10L3RgtCwINCyINC60L7QvdC10YYg0YHQv9C40YHQutCwCmJvb2wgbGlzdF9hZGQobGlzdComIGhlYWQsIGxpc3QqJiB0YWlsLCBpbnQgaW5mKXsKCWxpc3QqIHAgPSBuZXcgKHN0ZDo6bm90aHJvdykgbGlzdCgpOwoJaWYocCAhPSBOVUxMKXsKCQlwLT5pbmYgID0gaW5mOwoJCXAtPm5leHQgPSBwLT5wcmV2ID0gTlVMTDsKCQkKCQlpZihoZWFkID09IE5VTEwpCgkJCWhlYWQgPSB0YWlsID0gcDsKCQllbHNlIHsKCQkJdGFpbC0+bmV4dCA9IHA7CgkJCXAtPnByZXYgICAgPSB0YWlsOwoJCQl0YWlsID0gcDsKCQl9Cgl9CglyZXR1cm4gKHAgIT0gTlVMTCk7Cn0KCi8v0YPQtNCw0LvQtdC90LjQtSDQstGB0LXRhQp2b2lkIGxpc3RfY2xlYXIobGlzdComIGhlYWQsIGxpc3QqJiB0YWlsKXsKCWxpc3QqIHQ7Cgl3aGlsZShoZWFkICE9IE5VTEwpewoJCXQgICAgPSBoZWFkOwoJCWhlYWQgPSBoZWFkLT5uZXh0OwoJCWRlbGV0ZSB0OwoJfQoJdGFpbCA9IE5VTEw7Cn0=