#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <string>
template < typename T >
struct Node {
T data;
Node * next;
Node( T const & data )
: data( data ), next( 0 ) { }
~Node() {
delete next;
}
};
template < typename T >
struct LinkedList {
Node<T> * head;
size_t size;
// inner class
struct Wrapper {
bool (*callee)( T const &, T const & );
Wrapper( bool (*callee)(T const &, T const &) )
: callee( callee ) { }
bool operator()( Node<T> const * lhs, Node<T> const * rhs ) {
return (*callee)( lhs->data, rhs->data );
}
};
LinkedList()
: head( 0 ), size( 0 ) { }
~LinkedList() {
delete head;
}
void add( Node<T> * elem ) {
elem->next = head;
head = elem;
++size;
}
void sort( bool (*cmp)(T const &, T const &) ) {
Node<T> ** nodes = new Node<T>*[ size ];
size_t idx = 0;
for( Node<T> * curr = head; curr != 0; curr = curr->next ) {
nodes[ idx++ ] = curr;
}
std::sort( nodes, nodes+size, Wrapper(cmp) );
head = nodes[ 0 ];
for( idx = 1; idx != size; ++idx ) {
nodes[ idx-1 ]->next = nodes[ idx ];
}
nodes[ size-1 ]->next = 0;
delete [] nodes;
}
};
bool userDefinedComparator( std::string const & lhs,
std::string const & rhs ) {
return rhs < lhs;
}
int main() {
using namespace std;
LinkedList<string> ll;
ll.add( new Node<string>("world") );
ll.add( new Node<string>("the") );
ll.add( new Node<string>("hello") );
for( Node<string> * curr = ll.head; curr != 0; curr = curr->next ) {
cout << curr->data << " ";
}
cout << endl;
ll.sort( &userDefinedComparator );
for( Node<string> * curr = ll.head; curr != 0; curr = curr->next ) {
cout << curr->data << " ";
}
cout << endl;
}
I2luY2x1ZGUgPGNzdGRsaWI+CiAKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8c3RyaW5nPgogCnRlbXBsYXRlIDwgdHlwZW5hbWUgVCA+CnN0cnVjdCBOb2RlIHsKICAgIAogICAgVCBkYXRhOwogICAgTm9kZSAqIG5leHQ7CiAgICAKICAgIE5vZGUoIFQgY29uc3QgJiBkYXRhICkKICAgIDogZGF0YSggZGF0YSApLCBuZXh0KCAwICkgeyB9CiAgICAKICAgIH5Ob2RlKCkgewogICAgICAgIGRlbGV0ZSBuZXh0OwogICAgfQp9OwogCnRlbXBsYXRlIDwgdHlwZW5hbWUgVCA+CnN0cnVjdCBMaW5rZWRMaXN0IHsKICAgIAogICAgTm9kZTxUPiAqIGhlYWQ7CiAgICBzaXplX3Qgc2l6ZTsKICAgIAogICAgLy8gaW5uZXIgY2xhc3MKICAgIHN0cnVjdCBXcmFwcGVyIHsKICAgICAgICAKICAgICAgICBib29sICgqY2FsbGVlKSggVCBjb25zdCAmLCBUIGNvbnN0ICYgKTsKICAgICAgICAKICAgICAgICBXcmFwcGVyKCBib29sICgqY2FsbGVlKShUIGNvbnN0ICYsIFQgY29uc3QgJikgKSAKICAgICAgICA6IGNhbGxlZSggY2FsbGVlICkgeyB9CiAgICAgICAgCiAgICAgICAgYm9vbCBvcGVyYXRvcigpKCBOb2RlPFQ+IGNvbnN0ICogbGhzLCBOb2RlPFQ+IGNvbnN0ICogcmhzICkgewogICAgICAgICAgICByZXR1cm4gKCpjYWxsZWUpKCBsaHMtPmRhdGEsIHJocy0+ZGF0YSApOwogICAgICAgIH0KICAgIH07CiAgICAKICAgIExpbmtlZExpc3QoKSAKICAgIDogaGVhZCggMCApLCBzaXplKCAwICkgeyB9CiAgICAKICAgIH5MaW5rZWRMaXN0KCkgewogICAgICAgIGRlbGV0ZSBoZWFkOwogICAgfQogICAgCiAgICB2b2lkIGFkZCggTm9kZTxUPiAqIGVsZW0gKSB7CiAgICAgICAgZWxlbS0+bmV4dCA9IGhlYWQ7CiAgICAgICAgaGVhZCA9IGVsZW07CiAgICAgICAgKytzaXplOwogICAgfQogICAgCiAgICB2b2lkIHNvcnQoIGJvb2wgKCpjbXApKFQgY29uc3QgJiwgVCBjb25zdCAmKSApIHsKICAgICAgICAKICAgICAgICBOb2RlPFQ+ICoqIG5vZGVzID0gbmV3IE5vZGU8VD4qWyBzaXplIF07CiAgICAgICAgc2l6ZV90IGlkeCA9IDA7CiAgICAgICAgZm9yKCBOb2RlPFQ+ICogY3VyciA9IGhlYWQ7IGN1cnIgIT0gMDsgY3VyciA9IGN1cnItPm5leHQgKSB7CiAgICAgICAgICAgIG5vZGVzWyBpZHgrKyBdID0gY3VycjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc3RkOjpzb3J0KCBub2Rlcywgbm9kZXMrc2l6ZSwgV3JhcHBlcihjbXApICk7CiAgICAgICAgaGVhZCA9IG5vZGVzWyAwIF07CiAgICAgICAgZm9yKCBpZHggPSAxOyBpZHggIT0gc2l6ZTsgKytpZHggKSB7CiAgICAgICAgICAgIG5vZGVzWyBpZHgtMSBdLT5uZXh0ID0gbm9kZXNbIGlkeCBdOwogICAgICAgIH0KICAgICAgICBub2Rlc1sgc2l6ZS0xIF0tPm5leHQgPSAwOwogICAgICAgIGRlbGV0ZSBbXSBub2RlczsKICAgIH0KfTsKIApib29sIHVzZXJEZWZpbmVkQ29tcGFyYXRvciggc3RkOjpzdHJpbmcgY29uc3QgJiBsaHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCAmIHJocyApIHsKICAgIHJldHVybiByaHMgPCBsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKfQogCmludCBtYWluKCkgewogICAgCiAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogICAgCiAgICBMaW5rZWRMaXN0PHN0cmluZz4gbGw7ICAgIAogICAgbGwuYWRkKCBuZXcgTm9kZTxzdHJpbmc+KCJ3b3JsZCIpICk7CiAgICBsbC5hZGQoIG5ldyBOb2RlPHN0cmluZz4oInRoZSIpICk7CiAgICBsbC5hZGQoIG5ldyBOb2RlPHN0cmluZz4oImhlbGxvIikgKTsKICAgIAogICAgZm9yKCBOb2RlPHN0cmluZz4gKiBjdXJyID0gbGwuaGVhZDsgY3VyciAhPSAwOyBjdXJyID0gY3Vyci0+bmV4dCApIHsKICAgICAgICBjb3V0IDw8IGN1cnItPmRhdGEgPDwgIiAiOwogICAgfQogICAgY291dCA8PCBlbmRsOwogICAgCiAgICBsbC5zb3J0KCAmdXNlckRlZmluZWRDb21wYXJhdG9yICk7CiAgICAKICAgIGZvciggTm9kZTxzdHJpbmc+ICogY3VyciA9IGxsLmhlYWQ7IGN1cnIgIT0gMDsgY3VyciA9IGN1cnItPm5leHQgKSB7CiAgICAgICAgY291dCA8PCBjdXJyLT5kYXRhIDw8ICIgIjsKICAgIH0KICAgIGNvdXQgPDwgZW5kbDsKfQ==