/*
・参照透過性は考慮していない
・型のパラメータ化?には挑戦していない
・パターンマッチ再現?にも挑戦していない
・クロージャが欲しいところには呼び出し元の文脈を手渡して誤魔化す
・とにかくlist_qsort内部がそれっぽい感じの手順になってたらヨシとす
*/
#include <stdlib.h>
#include <stdio.h>
struct node {
int value;
struct node *next;
};
void list_each(void (f)(int), const struct node *list) {
for (; list; list = list->next) f(list->value);
}
struct node *list_cons(int value, struct node *next) {
struct node
*p
= malloc(sizeof (struct node
)); p->value = value, p->next = next;
return p;
}
void list_free(struct node *list) {
struct node *next;
for (; list
; list
= next
) next
= list
->next
, free(list
); }
struct node *rev(const struct node *list) {
struct node *p = 0;
for (; list; list = list->next) p = list_cons(list->value, p);
return p;
}
struct node *list_append(const struct node *a, const struct node *b) {
struct node *c = 0, *p, *next;
for (p = rev(b); p; p = next) next = p->next, p->next = c, c = p;
for (p = rev(a); p; p = next) next = p->next, p->next = c, c = p;
return c;
}
void list_partition(void *context, int (predicate)(void *, int), const struct node *list, struct node **a, struct node **b) {
struct node *p, *next, **x;
for (*a = 0, *b = 0, p = rev(list); p; p = next)
x = predicate(context, p->value) ? a : b, next = p->next, p->next = *x, *x = p;
}
int less_than_context(void *context, int value) {
return value < *(int *)context;
}
struct node *list_qsort(const struct node *list) {
int pivot;
struct node *sorted = 0, *tail, *smaller, *rest, *a, *b;
if (list) {
pivot = list->value, tail = list->next;
list_partition(&pivot, less_than_context, tail, &smaller, &rest);
sorted = list_append(a = list_qsort(smaller), b = list_cons(pivot, list_qsort(rest)));
list_free(smaller), list_free(rest), list_free(a), list_free(b);
}
return sorted;
}
void print_int
(int x
) {printf("%d", x
);} int main() {
struct node *list = list_cons(4, list_cons(8, list_cons(8, list_cons(3, 0))));
struct node *sorted = list_qsort(list);
list_each
(print_int
, list
);puts(""); list_each
(print_int
, sorted
);puts(""); list_free(list), list = 0;
list_free(sorted), sorted = 0;
return 0;
}
LyoKICDjg7vlj4LnhafpgI/pgY7mgKfjga/ogIPmha7jgZfjgabjgYTjgarjgYQKICDjg7vlnovjga7jg5Hjg6njg6Hjg7zjgr/ljJbvvJ/jgavjga/mjJHmiKbjgZfjgabjgYTjgarjgYQKICDjg7vjg5Hjgr/jg7zjg7Pjg57jg4Pjg4Hlho3nj77vvJ/jgavjgoLmjJHmiKbjgZfjgabjgYTjgarjgYQKICDjg7vjgq/jg63jg7zjgrjjg6PjgYzmrLLjgZfjgYTjgajjgZPjgo3jgavjga/lkbzjgbPlh7rjgZflhYPjga7mlofohIjjgpLmiYvmuKHjgZfjgaboqqTprZTljJbjgZkKICDjg7vjgajjgavjgYvjgY9saXN0X3Fzb3J05YaF6YOo44GM44Gd44KM44Gj44G944GE5oSf44GY44Gu5omL6aCG44Gr44Gq44Gj44Gm44Gf44KJ44Oo44K344Go44GZCiovCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CnN0cnVjdCBub2RlIHsKICBpbnQgdmFsdWU7CiAgc3RydWN0IG5vZGUgKm5leHQ7Cn07CnZvaWQgbGlzdF9lYWNoKHZvaWQgKGYpKGludCksIGNvbnN0IHN0cnVjdCBub2RlICpsaXN0KSB7CiAgZm9yICg7IGxpc3Q7IGxpc3QgPSBsaXN0LT5uZXh0KSBmKGxpc3QtPnZhbHVlKTsKfQpzdHJ1Y3Qgbm9kZSAqbGlzdF9jb25zKGludCB2YWx1ZSwgc3RydWN0IG5vZGUgKm5leHQpIHsKICBzdHJ1Y3Qgbm9kZSAqcCA9IG1hbGxvYyhzaXplb2YgKHN0cnVjdCBub2RlKSk7CiAgcC0+dmFsdWUgPSB2YWx1ZSwgcC0+bmV4dCA9IG5leHQ7CiAgcmV0dXJuIHA7Cn0Kdm9pZCBsaXN0X2ZyZWUoc3RydWN0IG5vZGUgKmxpc3QpIHsKICBzdHJ1Y3Qgbm9kZSAqbmV4dDsKICBmb3IgKDsgbGlzdDsgbGlzdCA9IG5leHQpIG5leHQgPSBsaXN0LT5uZXh0LCBmcmVlKGxpc3QpOwp9CnN0cnVjdCBub2RlICpyZXYoY29uc3Qgc3RydWN0IG5vZGUgKmxpc3QpIHsKICBzdHJ1Y3Qgbm9kZSAqcCA9IDA7CiAgZm9yICg7IGxpc3Q7IGxpc3QgPSBsaXN0LT5uZXh0KSBwID0gbGlzdF9jb25zKGxpc3QtPnZhbHVlLCBwKTsKICByZXR1cm4gcDsKfQpzdHJ1Y3Qgbm9kZSAqbGlzdF9hcHBlbmQoY29uc3Qgc3RydWN0IG5vZGUgKmEsIGNvbnN0IHN0cnVjdCBub2RlICpiKSB7CiAgc3RydWN0IG5vZGUgKmMgPSAwLCAqcCwgKm5leHQ7CiAgZm9yIChwID0gcmV2KGIpOyBwOyBwID0gbmV4dCkgbmV4dCA9IHAtPm5leHQsIHAtPm5leHQgPSBjLCBjID0gcDsKICBmb3IgKHAgPSByZXYoYSk7IHA7IHAgPSBuZXh0KSBuZXh0ID0gcC0+bmV4dCwgcC0+bmV4dCA9IGMsIGMgPSBwOwogIHJldHVybiBjOwp9CnZvaWQgbGlzdF9wYXJ0aXRpb24odm9pZCAqY29udGV4dCwgaW50IChwcmVkaWNhdGUpKHZvaWQgKiwgaW50KSwgY29uc3Qgc3RydWN0IG5vZGUgKmxpc3QsIHN0cnVjdCBub2RlICoqYSwgc3RydWN0IG5vZGUgKipiKSB7CiAgc3RydWN0IG5vZGUgKnAsICpuZXh0LCAqKng7CiAgZm9yICgqYSA9IDAsICpiID0gMCwgcCA9IHJldihsaXN0KTsgcDsgcCA9IG5leHQpCiAgICB4ID0gcHJlZGljYXRlKGNvbnRleHQsIHAtPnZhbHVlKSA/IGEgOiBiLCBuZXh0ID0gcC0+bmV4dCwgcC0+bmV4dCA9ICp4LCAqeCA9IHA7Cn0KaW50IGxlc3NfdGhhbl9jb250ZXh0KHZvaWQgKmNvbnRleHQsIGludCB2YWx1ZSkgewogIHJldHVybiB2YWx1ZSA8ICooaW50ICopY29udGV4dDsKfQpzdHJ1Y3Qgbm9kZSAqbGlzdF9xc29ydChjb25zdCBzdHJ1Y3Qgbm9kZSAqbGlzdCkgewogIGludCBwaXZvdDsKICBzdHJ1Y3Qgbm9kZSAqc29ydGVkID0gMCwgKnRhaWwsICpzbWFsbGVyLCAqcmVzdCwgKmEsICpiOwogIGlmIChsaXN0KSB7CiAgICBwaXZvdCA9IGxpc3QtPnZhbHVlLCB0YWlsID0gbGlzdC0+bmV4dDsKICAgIGxpc3RfcGFydGl0aW9uKCZwaXZvdCwgbGVzc190aGFuX2NvbnRleHQsIHRhaWwsICZzbWFsbGVyLCAmcmVzdCk7CiAgICBzb3J0ZWQgPSBsaXN0X2FwcGVuZChhID0gbGlzdF9xc29ydChzbWFsbGVyKSwgYiA9IGxpc3RfY29ucyhwaXZvdCwgbGlzdF9xc29ydChyZXN0KSkpOwogICAgbGlzdF9mcmVlKHNtYWxsZXIpLCBsaXN0X2ZyZWUocmVzdCksIGxpc3RfZnJlZShhKSwgbGlzdF9mcmVlKGIpOwogIH0KICByZXR1cm4gc29ydGVkOwp9CnZvaWQgcHJpbnRfaW50KGludCB4KSB7cHJpbnRmKCIlZCIsIHgpO30KaW50IG1haW4oKSB7CiAgc3RydWN0IG5vZGUgKmxpc3QgPSBsaXN0X2NvbnMoNCwgbGlzdF9jb25zKDgsIGxpc3RfY29ucyg4LCBsaXN0X2NvbnMoMywgMCkpKSk7CiAgc3RydWN0IG5vZGUgKnNvcnRlZCA9IGxpc3RfcXNvcnQobGlzdCk7CiAgbGlzdF9lYWNoKHByaW50X2ludCwgbGlzdCk7cHV0cygiIik7CiAgbGlzdF9lYWNoKHByaW50X2ludCwgc29ydGVkKTtwdXRzKCIiKTsKICBsaXN0X2ZyZWUobGlzdCksIGxpc3QgPSAwOwogIGxpc3RfZnJlZShzb3J0ZWQpLCBzb3J0ZWQgPSAwOwogIHJldHVybiAwOwp9Cg==