#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
typedef struct s_node s_node;
typedef struct s_list s_list;
struct s_node {
s_node * next;
};
struct s_list {
s_node * tail;
};
s_node * append_node(s_list * list) {
s_node * new_node;
new_node
= malloc(sizeof *new_node
); if (!new_node)
return NULL;
/* Check for empty list */
if (!list->tail) {
new_node->next = new_node;
list->tail = new_node;
return new_node;
}
new_node->next = list->tail->next;
list->tail->next = new_node;
list->tail = new_node;
return new_node;
}
s_node * head_node(s_list * list) {
/* Check for empty list */
if (!list->tail)
return NULL;
return list->tail->next;
}
int list_length(s_list * list) {
s_node * node;
int len = 0;
for (node = head_node(list); node; node = node->next) {
"%p->next == %p%s\n",
(void *) node,
(void *) node->next,
node == list->tail ? "" : " &&"
);
++len;
if (node == list->tail)
break;
continue;
}
return len;
}
int main(void) {
s_list list[1];
list->tail = NULL;
if (append_node(list) && append_node(list) && append_node(list))
printf("Total nodes: %d\n", list_length
(list
));
return EXIT_SUCCESS;
}
I2luY2x1ZGUgPHN0ZGRlZi5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRpby5oPgoKdHlwZWRlZiBzdHJ1Y3Qgc19ub2RlIHNfbm9kZTsKdHlwZWRlZiBzdHJ1Y3Qgc19saXN0IHNfbGlzdDsKc3RydWN0IHNfbm9kZSB7CiAgICBzX25vZGUgKiBuZXh0OwogIH07CnN0cnVjdCBzX2xpc3QgewogICAgc19ub2RlICogdGFpbDsKICB9OwoKc19ub2RlICogYXBwZW5kX25vZGUoc19saXN0ICogbGlzdCkgewogICAgc19ub2RlICogbmV3X25vZGU7CgogICAgbmV3X25vZGUgPSBtYWxsb2Moc2l6ZW9mICpuZXdfbm9kZSk7CiAgICBpZiAoIW5ld19ub2RlKQogICAgICByZXR1cm4gTlVMTDsKCiAgICAvKiBDaGVjayBmb3IgZW1wdHkgbGlzdCAqLwogICAgaWYgKCFsaXN0LT50YWlsKSB7CiAgICAgICAgbmV3X25vZGUtPm5leHQgPSBuZXdfbm9kZTsKICAgICAgICBsaXN0LT50YWlsID0gbmV3X25vZGU7CiAgICAgICAgcmV0dXJuIG5ld19ub2RlOwogICAgICB9CgogICAgbmV3X25vZGUtPm5leHQgPSBsaXN0LT50YWlsLT5uZXh0OwogICAgbGlzdC0+dGFpbC0+bmV4dCA9IG5ld19ub2RlOwogICAgbGlzdC0+dGFpbCA9IG5ld19ub2RlOwogICAgcmV0dXJuIG5ld19ub2RlOwogIH0KCnNfbm9kZSAqIGhlYWRfbm9kZShzX2xpc3QgKiBsaXN0KSB7CiAgICAvKiBDaGVjayBmb3IgZW1wdHkgbGlzdCAqLwogICAgaWYgKCFsaXN0LT50YWlsKQogICAgICByZXR1cm4gTlVMTDsKCiAgICByZXR1cm4gbGlzdC0+dGFpbC0+bmV4dDsKICB9CgppbnQgbGlzdF9sZW5ndGgoc19saXN0ICogbGlzdCkgewogICAgc19ub2RlICogbm9kZTsKICAgIGludCBsZW4gPSAwOwoKICAgIGZvciAobm9kZSA9IGhlYWRfbm9kZShsaXN0KTsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKICAgICAgICBwcmludGYoCiAgICAgICAgICAgICIlcC0+bmV4dCA9PSAlcCVzXG4iLAogICAgICAgICAgICAodm9pZCAqKSBub2RlLAogICAgICAgICAgICAodm9pZCAqKSBub2RlLT5uZXh0LAogICAgICAgICAgICBub2RlID09IGxpc3QtPnRhaWwgPyAiIiA6ICIgJiYiCiAgICAgICAgICApOwogICAgICAgICsrbGVuOwogICAgICAgIGlmIChub2RlID09IGxpc3QtPnRhaWwpCiAgICAgICAgICBicmVhazsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgcmV0dXJuIGxlbjsKICB9CgppbnQgbWFpbih2b2lkKSB7CiAgICBzX2xpc3QgbGlzdFsxXTsKCiAgICBsaXN0LT50YWlsID0gTlVMTDsKCiAgICBpZiAoYXBwZW5kX25vZGUobGlzdCkgJiYgYXBwZW5kX25vZGUobGlzdCkgJiYgYXBwZW5kX25vZGUobGlzdCkpCiAgICAgIHByaW50ZigiVG90YWwgbm9kZXM6ICVkXG4iLCBsaXN0X2xlbmd0aChsaXN0KSk7CgogICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKICB9