#include <iostream>
#include <cstring>
template<typename T>
struct node {
T val;
node<T>* next;
};
template<typename T>
class single_list {
private:
node<T>* head;
node<T>* tail;
size_t cnt;
public:
single_list(void):head(NULL),
tail(NULL),
cnt(0){}
~single_list(){
this->clear();
}
single_list(const single_list&);
single_list& operator = (const single_list&);
public:
//добавление элемента в конец
bool add_back(const T& val){
node<T>* p = new_node(val);
if(p != NULL){
if(head == NULL)
head = tail = p;
else {
tail->next = p;
tail = p;
}
}
return (p != NULL);
}
//сортировка
template<typename Cmp>
void sort(Cmp cmp){
head = _merge_sort(head, &tail, cmp);
}
//удаление всех элементов
void clear(void){
node<T>* tmp;
while(head != NULL){
tmp = head;
head = head->next;
delete tmp;
}
tail = NULL;
cnt = 0;
}
size_t size(void) const { return cnt; }
node<T>* begin(void){ return head; }
node<T>* begin(void) const { return head; }
private:
node<T>* new_node(const T& val){
node<T>* p = new (std::nothrow) node<T>();
if(p != NULL){
p->val = val;
p->next = NULL;
++cnt;
}
return p;
}
//сортировкa слиянием
template<typename Cmp>
node<T>* _merge_sort(node<T>* lst, node<T>** ptail, Cmp cmp) {
if((lst == NULL) || (lst->next == NULL))
return lst;
node<T>* ptr, *next, *end;
node<T>* first = lst;
node<T>* last = lst;
ptr = next = end = NULL;
for(node<T>* p = lst; (p != NULL) && (p->next != NULL); p = p->next->next) {
last = first;
first = first->next;
}
last->next = NULL;
lst = _merge_sort(lst, ptail, cmp);
first = _merge_sort(first, ptail, cmp);
while((lst != NULL) || (first != NULL)){
if(first == NULL) {
next = lst;
lst = lst->next;
} else if(lst == NULL){
next = first;
first = first->next;
} else if(cmp(lst->val, first->val)){
next = lst;
lst = lst->next;
} else {
next = first;
first = first->next;
}
if(ptr == NULL)
ptr = next;
else
end->next = next;
end = next;
}
*ptail = end;
return ptr;
}
};
//----------------------------------------------------------------------------
typedef struct {
char l_name[16];
int year;
} book;
struct book_cmp {
bool operator () (const book& a, const book& b)const{
int res = strcmp(a.l_name, b.l_name);
return ((res < 0) || (! res && (a.year < b.year)));
}
};
int main(void){
const size_t N = 8;
const book arr[N] = {
{"wwww", 1997}, {"aaaa", 2000}, {"aaaa", 1997}, {"wwww", 1965},
{"wwww", 1993}, {"cccc", 1997}, {"cccc", 1993}, {"aaaa", 1999}
};
single_list<book> lst;
for(size_t i = 0; i < N; ++i)
lst.add_back(arr[i]);
lst.sort(book_cmp());
for(const node<book>* p = lst.begin(); p != NULL; p = p->next)
std::cout << p->val.l_name << ' ' << p->val.year << std::endl;
lst.clear();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0cmluZz4KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnN0cnVjdCBub2RlIHsKCVQgdmFsOwoJbm9kZTxUPiogbmV4dDsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIHNpbmdsZV9saXN0IHsKcHJpdmF0ZToKCW5vZGU8VD4qIGhlYWQ7Cglub2RlPFQ+KiB0YWlsOwoJc2l6ZV90ICAgY250OwpwdWJsaWM6CglzaW5nbGVfbGlzdCh2b2lkKTpoZWFkKE5VTEwpLAoJICAgICAgICAgICAgICAgICAgdGFpbChOVUxMKSwgCgkgICAgICAgICAgICAgICAgICBjbnQoMCl7fQoJfnNpbmdsZV9saXN0KCl7CgkJdGhpcy0+Y2xlYXIoKTsKCX0KCXNpbmdsZV9saXN0KGNvbnN0IHNpbmdsZV9saXN0Jik7CglzaW5nbGVfbGlzdCYgb3BlcmF0b3IgPSAoY29uc3Qgc2luZ2xlX2xpc3QmKTsKcHVibGljOgoJLy/QtNC+0LHQsNCy0LvQtdC90LjQtSDRjdC70LXQvNC10L3RgtCwINCyINC60L7QvdC10YYKCWJvb2wgYWRkX2JhY2soY29uc3QgVCYgdmFsKXsKCQlub2RlPFQ+KiBwID0gbmV3X25vZGUodmFsKTsKCQlpZihwICE9IE5VTEwpewoJCQlpZihoZWFkID09IE5VTEwpCgkJCQloZWFkID0gdGFpbCA9IHA7CgkJCWVsc2UgewoJCQkJdGFpbC0+bmV4dCA9IHA7CgkJCQl0YWlsID0gcDsKCQkJfQoJCX0KCQlyZXR1cm4gKHAgIT0gTlVMTCk7Cgl9CgoJLy/RgdC+0YDRgtC40YDQvtCy0LrQsAoJdGVtcGxhdGU8dHlwZW5hbWUgQ21wPgoJdm9pZCBzb3J0KENtcCBjbXApewoJCWhlYWQgPSBfbWVyZ2Vfc29ydChoZWFkLCAmdGFpbCwgY21wKTsKCX0KCgkvL9GD0LTQsNC70LXQvdC40LUg0LLRgdC10YUg0Y3Qu9C10LzQtdC90YLQvtCyCgl2b2lkIGNsZWFyKHZvaWQpewoJCW5vZGU8VD4qIHRtcDsKCQl3aGlsZShoZWFkICE9IE5VTEwpewoJCQl0bXAgID0gaGVhZDsKCQkJaGVhZCA9IGhlYWQtPm5leHQ7CgkJCWRlbGV0ZSB0bXA7CgkJfQoJCXRhaWwgPSBOVUxMOwoJCWNudCAgPSAwOwoJfQkKCglzaXplX3QgICBzaXplKHZvaWQpIGNvbnN0IHsgcmV0dXJuIGNudDsgfQoJbm9kZTxUPiogYmVnaW4odm9pZCl7IHJldHVybiBoZWFkOyB9Cglub2RlPFQ+KiBiZWdpbih2b2lkKSBjb25zdCB7IHJldHVybiBoZWFkOyB9CnByaXZhdGU6Cglub2RlPFQ+KiBuZXdfbm9kZShjb25zdCBUJiB2YWwpewoJCW5vZGU8VD4qIHAgPSBuZXcgKHN0ZDo6bm90aHJvdykgbm9kZTxUPigpOwoJCWlmKHAgIT0gTlVMTCl7CgkJCXAtPnZhbCAgPSB2YWw7CgkJCXAtPm5leHQgPSBOVUxMOwoJCQkrK2NudDsKCQl9CgkJcmV0dXJuIHA7Cgl9CgoJLy/RgdC+0YDRgtC40YDQvtCy0LphINGB0LvQuNGP0L3QuNC10LwKCXRlbXBsYXRlPHR5cGVuYW1lIENtcD4KCW5vZGU8VD4qIF9tZXJnZV9zb3J0KG5vZGU8VD4qIGxzdCwgbm9kZTxUPioqIHB0YWlsLCBDbXAgY21wKSB7CgkJaWYoKGxzdCA9PSBOVUxMKSB8fCAobHN0LT5uZXh0ID09IE5VTEwpKQoJCQlyZXR1cm4gbHN0OwoJCW5vZGU8VD4qIHB0ciwgKm5leHQsICplbmQ7CgkJbm9kZTxUPiogZmlyc3QgPSBsc3Q7CgkJbm9kZTxUPiogbGFzdCAgPSBsc3Q7CgoJCXB0ciA9IG5leHQgPSBlbmQgPSBOVUxMOwoJCWZvcihub2RlPFQ+KiBwID0gbHN0OyAocCAhPSBOVUxMKSAmJiAocC0+bmV4dCAhPSBOVUxMKTsgcCA9IHAtPm5leHQtPm5leHQpIHsKCQkJbGFzdCAgPSBmaXJzdDsKCQkJZmlyc3QgPSBmaXJzdC0+bmV4dDsKCQl9CgkJbGFzdC0+bmV4dCA9IE5VTEw7CgoJCWxzdCAgID0gX21lcmdlX3NvcnQobHN0LCAgIHB0YWlsLCBjbXApOwoJCWZpcnN0ID0gX21lcmdlX3NvcnQoZmlyc3QsIHB0YWlsLCBjbXApOwoKCQl3aGlsZSgobHN0ICE9IE5VTEwpIHx8IChmaXJzdCAhPSBOVUxMKSl7IAoJCQlpZihmaXJzdCA9PSBOVUxMKSB7CgkJCQluZXh0ID0gbHN0OwoJCQkJbHN0ICA9IGxzdC0+bmV4dDsKCQkJfSBlbHNlIGlmKGxzdCA9PSBOVUxMKXsKCQkJCW5leHQgID0gZmlyc3Q7CgkJCQlmaXJzdCA9IGZpcnN0LT5uZXh0OwoJCQl9IGVsc2UgaWYoY21wKGxzdC0+dmFsLCBmaXJzdC0+dmFsKSl7CgkJCQluZXh0ID0gbHN0OwoJCQkJbHN0ICA9IGxzdC0+bmV4dDsKCQkJfSBlbHNlIHsKCQkJCW5leHQgID0gZmlyc3Q7CgkJCQlmaXJzdCA9IGZpcnN0LT5uZXh0OwoJCQl9CgoJCQlpZihwdHIgPT0gTlVMTCkKCQkJCXB0ciA9IG5leHQ7CgkJCWVsc2UKCQkJCWVuZC0+bmV4dCA9IG5leHQ7CgkJCWVuZCA9IG5leHQ7CgkJfQoJCSpwdGFpbCA9IGVuZDsKCQlyZXR1cm4gcHRyOwoJfQp9OwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp0eXBlZGVmIHN0cnVjdCB7CgljaGFyIGxfbmFtZVsxNl07CglpbnQgIHllYXI7Cn0gYm9vazsKCnN0cnVjdCBib29rX2NtcCB7Cglib29sIG9wZXJhdG9yICgpIChjb25zdCBib29rJiBhLCBjb25zdCBib29rJiBiKWNvbnN0ewoJCWludCByZXMgPSBzdHJjbXAoYS5sX25hbWUsIGIubF9uYW1lKTsKCQlyZXR1cm4gKChyZXMgPCAwKSB8fCAoISByZXMgJiYgKGEueWVhciA8IGIueWVhcikpKTsKCX0KfTsKCgppbnQgbWFpbih2b2lkKXsKCWNvbnN0IHNpemVfdCBOID0gODsKCWNvbnN0IGJvb2sgYXJyW05dID0gewoJCXsid3d3dyIsIDE5OTd9LCB7ImFhYWEiLCAyMDAwfSwgeyJhYWFhIiwgMTk5N30sIHsid3d3dyIsIDE5NjV9LAoJCXsid3d3dyIsIDE5OTN9LCB7ImNjY2MiLCAxOTk3fSwgeyJjY2NjIiwgMTk5M30sIHsiYWFhYSIsIDE5OTl9Cgl9OwoKCXNpbmdsZV9saXN0PGJvb2s+IGxzdDsKCWZvcihzaXplX3QgaSA9IDA7IGkgPCBOOyArK2kpCgkJbHN0LmFkZF9iYWNrKGFycltpXSk7CgoJbHN0LnNvcnQoYm9va19jbXAoKSk7Cglmb3IoY29uc3Qgbm9kZTxib29rPiogcCA9IGxzdC5iZWdpbigpOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQoJCXN0ZDo6Y291dCA8PCBwLT52YWwubF9uYW1lIDw8ICcgJyA8PCBwLT52YWwueWVhciA8PCBzdGQ6OmVuZGw7Cglsc3QuY2xlYXIoKTsKCXJldHVybiAwOwp9