#include <stdio.h>
#include <stdlib.h>
struct list_t {
struct list_t *next;
void *value;
};
struct list_t *list_new () {
return (struct list_t
*) malloc(sizeof(struct list_t
)); }
void list_free (struct list_t *xs) {
struct list_t *next = NULL;
for (; xs != NULL; xs = next) {
next = xs->next;
}
}
struct list_t *list_reverse (struct list_t *xs) {
struct list_t *ret = NULL;
struct list_t *next = NULL;
for (; xs != NULL; xs = xs->next) {
if ((next = list_new()) == NULL) goto err;
next->value = xs->value;
next->next = ret;
ret = next;
}
goto ok;
err:
list_free(ret);
ok:
return ret;
}
struct list_t *list_int_prepend(int v, struct list_t *next) {
struct list_t *this = list_new(); if (this == NULL) goto err1;
void *val
= malloc(sizeof(int)); if (val
== NULL
) goto err2
; this->next = next;
this->value = val;
*((int*)val) = v;
return this;
err2:
list_free(this);
err1:
return NULL;
}
void list_int_printf(struct list_t *this) {
for (; this != NULL; this = this->next) {
printf("%d ", *((int*)this
->value
)); }
}
int main(void) {
struct list_t *xs = NULL;
xs = list_int_prepend(1, xs);
xs = list_int_prepend(3, xs);
xs = list_int_prepend(5, xs);
xs = list_int_prepend(2, xs);
xs = list_int_prepend(11, xs);
struct list_t *ys = list_reverse(xs);
list_int_printf(xs);
list_int_printf(ys);
list_free(xs);
list_free(ys);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCnN0cnVjdCBsaXN0X3QgewogIHN0cnVjdCBsaXN0X3QgKm5leHQ7CiAgdm9pZCAgICAgICAgICAqdmFsdWU7Cn07CgpzdHJ1Y3QgbGlzdF90ICpsaXN0X25ldyAoKSB7CiAgcmV0dXJuIChzdHJ1Y3QgbGlzdF90ICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IGxpc3RfdCkpOwp9Cgp2b2lkIGxpc3RfZnJlZSAoc3RydWN0IGxpc3RfdCAqeHMpIHsKICBzdHJ1Y3QgbGlzdF90ICpuZXh0ID0gTlVMTDsKCiAgZm9yICg7IHhzICE9IE5VTEw7IHhzID0gbmV4dCkgewogICAgbmV4dCA9IHhzLT5uZXh0OwogICAgZnJlZSh4cyk7CiAgfQp9CgpzdHJ1Y3QgbGlzdF90ICpsaXN0X3JldmVyc2UgKHN0cnVjdCBsaXN0X3QgKnhzKSB7CiAgc3RydWN0IGxpc3RfdCAqcmV0ICA9IE5VTEw7CiAgc3RydWN0IGxpc3RfdCAqbmV4dCA9IE5VTEw7CgogIGZvciAoOyB4cyAhPSBOVUxMOyB4cyA9IHhzLT5uZXh0KSB7CiAgICBpZiAoKG5leHQgPSBsaXN0X25ldygpKSA9PSBOVUxMKSBnb3RvIGVycjsKICAgIG5leHQtPnZhbHVlID0geHMtPnZhbHVlOwogICAgbmV4dC0+bmV4dCAgPSByZXQ7CiAgICByZXQgPSBuZXh0OwogIH0KICBnb3RvIG9rOwoKZXJyOgogIGxpc3RfZnJlZShyZXQpOwpvazoKICByZXR1cm4gcmV0Owp9CgpzdHJ1Y3QgbGlzdF90ICpsaXN0X2ludF9wcmVwZW5kKGludCB2LCBzdHJ1Y3QgbGlzdF90ICpuZXh0KSB7CiAgc3RydWN0IGxpc3RfdCAqdGhpcyA9IGxpc3RfbmV3KCk7IGlmICh0aGlzID09IE5VTEwpIGdvdG8gZXJyMTsKICB2b2lkICp2YWwgPSBtYWxsb2Moc2l6ZW9mKGludCkpOyAgaWYgKHZhbCAgPT0gTlVMTCkgZ290byBlcnIyOwogIHRoaXMtPm5leHQgID0gbmV4dDsKICB0aGlzLT52YWx1ZSA9IHZhbDsKICAqKChpbnQqKXZhbCkgPSB2OwogIHJldHVybiB0aGlzOwplcnIyOgogIGxpc3RfZnJlZSh0aGlzKTsKZXJyMToKICByZXR1cm4gTlVMTDsKfQoKdm9pZCBsaXN0X2ludF9wcmludGYoc3RydWN0IGxpc3RfdCAqdGhpcykgewogIGZvciAoOyB0aGlzICE9IE5VTEw7IHRoaXMgPSB0aGlzLT5uZXh0KSB7CiAgICBwcmludGYoIiVkICIsICooKGludCopdGhpcy0+dmFsdWUpKTsKICB9CiAgcHJpbnRmKCJcbiIpOwp9CgppbnQgbWFpbih2b2lkKSB7CiAgc3RydWN0IGxpc3RfdCAqeHMgPSBOVUxMOwogIHhzID0gbGlzdF9pbnRfcHJlcGVuZCgxLCB4cyk7CiAgeHMgPSBsaXN0X2ludF9wcmVwZW5kKDMsIHhzKTsKICB4cyA9IGxpc3RfaW50X3ByZXBlbmQoNSwgeHMpOwogIHhzID0gbGlzdF9pbnRfcHJlcGVuZCgyLCB4cyk7CiAgeHMgPSBsaXN0X2ludF9wcmVwZW5kKDExLCB4cyk7CiAgc3RydWN0IGxpc3RfdCAqeXMgPSBsaXN0X3JldmVyc2UoeHMpOwogIGxpc3RfaW50X3ByaW50Zih4cyk7CiAgbGlzdF9pbnRfcHJpbnRmKHlzKTsKICBsaXN0X2ZyZWUoeHMpOwogIGxpc3RfZnJlZSh5cyk7CiAgcmV0dXJuIDA7Cn0=