#include <iostream>
#include <random>
struct Node
{
int data;
Node *next;
Node(int arg, Node *nxt = nullptr)
: data(arg), next(nxt)
{}
Node(const Node&) = delete;
Node& operator =(const Node&) = delete;
};
void print_nodes(const Node* lst)
{
while (lst)
{
std::cout << lst->data << ' ';
lst = lst->next;
}
std::cout << '\n';
}
void sort_nodes(Node*& head)
{
Node *dst = NULL;
Node **psrc = &head;
while (*psrc)
{
Node ** pdst = &dst;
while (*pdst && (*pdst)->data < (*psrc)->data)
pdst = &(*pdst)->next;
Node *tmp = *psrc;
*psrc = (*psrc)->next;
tmp->next = *pdst;
*pdst = tmp;
// print intermediate results
print_nodes(dst);
}
*psrc = dst;
}
int main()
{
std::random_device rd;
std::default_random_engine rng(rd());
std::uniform_int_distribution<> dist(1,100);
Node *lst = nullptr;
for (int i=0; i<15; ++i)
lst = new Node(dist(rng), lst);
print_nodes(lst);
sort_nodes(lst);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cmFuZG9tPgoKc3RydWN0IE5vZGUKewogICAgaW50IGRhdGE7CiAgICBOb2RlICpuZXh0OwoKICAgIE5vZGUoaW50IGFyZywgTm9kZSAqbnh0ID0gbnVsbHB0cikKICAgICAgICA6IGRhdGEoYXJnKSwgbmV4dChueHQpCiAgICB7fQogICAgCiAgICBOb2RlKGNvbnN0IE5vZGUmKSA9IGRlbGV0ZTsKICAgIE5vZGUmIG9wZXJhdG9yID0oY29uc3QgTm9kZSYpID0gZGVsZXRlOwp9OwoKdm9pZCBwcmludF9ub2Rlcyhjb25zdCBOb2RlKiBsc3QpCnsKICAgIHdoaWxlIChsc3QpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8IGxzdC0+ZGF0YSA8PCAnICc7CiAgICAgICAgbHN0ID0gbHN0LT5uZXh0OwogICAgfQogICAgc3RkOjpjb3V0IDw8ICdcbic7Cn0KCnZvaWQgc29ydF9ub2RlcyhOb2RlKiYgaGVhZCkKewogICAgTm9kZSAqZHN0ID0gTlVMTDsKICAgIE5vZGUgKipwc3JjID0gJmhlYWQ7CiAgICAKICAgIHdoaWxlICgqcHNyYykKICAgIHsKICAgICAgICBOb2RlICoqIHBkc3QgPSAmZHN0OwogICAgICAgIHdoaWxlICgqcGRzdCAmJiAoKnBkc3QpLT5kYXRhIDwgKCpwc3JjKS0+ZGF0YSkKICAgICAgICAgICAgcGRzdCA9ICYoKnBkc3QpLT5uZXh0OwogICAgICAgIAogICAgICAgIE5vZGUgKnRtcCA9ICpwc3JjOwogICAgICAgICpwc3JjID0gKCpwc3JjKS0+bmV4dDsKICAgICAgICB0bXAtPm5leHQgPSAqcGRzdDsKICAgICAgICAqcGRzdCA9IHRtcDsKICAgICAgICAKICAgICAgICAvLyBwcmludCBpbnRlcm1lZGlhdGUgcmVzdWx0cwogICAgICAgIHByaW50X25vZGVzKGRzdCk7CiAgICB9CiAgICAKICAgICpwc3JjID0gZHN0Owp9CgppbnQgbWFpbigpCnsKICAgIHN0ZDo6cmFuZG9tX2RldmljZSByZDsKICAgIHN0ZDo6ZGVmYXVsdF9yYW5kb21fZW5naW5lIHJuZyhyZCgpKTsKICAgIHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPD4gZGlzdCgxLDEwMCk7CiAgICAKICAgIE5vZGUgKmxzdCA9IG51bGxwdHI7CiAgICBmb3IgKGludCBpPTA7IGk8MTU7ICsraSkKICAgICAgICBsc3QgPSBuZXcgTm9kZShkaXN0KHJuZyksIGxzdCk7CiAgICAKICAgIHByaW50X25vZGVzKGxzdCk7CiAgICBzb3J0X25vZGVzKGxzdCk7Cn0=