#include <stdio.h>
#include <stdlib.h>
struct link {
struct link *next;
};
struct link *link(struct link *next) {
struct link
*node
= malloc(sizeof *node
); if (node) {
node->next = next;
}
return node;
}
struct link *append(struct link ***tail) {
struct link *node = link(**tail);
if (link) {
**tail = link(**tail);
*tail = &(**tail)->next;
}
return node;
}
size_t length(struct link *node) {
size_t length = 0;
while (node) {
length += 1;
node = node->next;
}
return length;
}
int main() {
struct link *list = NULL;
struct link **tail = &list;
if (append(&tail) && append(&tail) && append(&tail)) {
printf("%zu\n", length
(list
)); }
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCnN0cnVjdCBsaW5rIHsKICBzdHJ1Y3QgbGluayAqbmV4dDsKfTsKCnN0cnVjdCBsaW5rICpsaW5rKHN0cnVjdCBsaW5rICpuZXh0KSB7CiAgc3RydWN0IGxpbmsgKm5vZGUgPSBtYWxsb2Moc2l6ZW9mICpub2RlKTsKICBpZiAobm9kZSkgewogICAgbm9kZS0+bmV4dCA9IG5leHQ7CiAgfQogIHJldHVybiBub2RlOwp9CgpzdHJ1Y3QgbGluayAqYXBwZW5kKHN0cnVjdCBsaW5rICoqKnRhaWwpIHsKICBzdHJ1Y3QgbGluayAqbm9kZSA9IGxpbmsoKip0YWlsKTsKICBpZiAobGluaykgewogICAgKip0YWlsID0gbGluaygqKnRhaWwpOwogICAgKnRhaWwgPSAmKCoqdGFpbCktPm5leHQ7CiAgfQogIHJldHVybiBub2RlOwp9CgpzaXplX3QgbGVuZ3RoKHN0cnVjdCBsaW5rICpub2RlKSB7CiAgc2l6ZV90IGxlbmd0aCA9IDA7CiAgd2hpbGUgKG5vZGUpIHsKICAgIGxlbmd0aCArPSAxOwogICAgbm9kZSA9IG5vZGUtPm5leHQ7CiAgfQogIHJldHVybiBsZW5ndGg7Cn0KCmludCBtYWluKCkgewogIHN0cnVjdCBsaW5rICpsaXN0ID0gTlVMTDsKICBzdHJ1Y3QgbGluayAqKnRhaWwgPSAmbGlzdDsKCiAgaWYgKGFwcGVuZCgmdGFpbCkgJiYgYXBwZW5kKCZ0YWlsKSAmJiBhcHBlbmQoJnRhaWwpKSB7CiAgICBwcmludGYoIiV6dVxuIiwgbGVuZ3RoKGxpc3QpKTsKICB9CiAgcmV0dXJuIDA7Cn0=