#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
typedef struct links {
struct links * next;
struct links * prev;
} links;
typedef struct outer_node {
links l; // links to outer_node.l
struct inner_node * children;
} outer_node;
typedef struct inner_node {
links l; // links to inner_node.l
char type;
void * item;
} inner_node;
void linkNodes(links* l1, links* l2)
{
links* tmp = l1->prev;
l1->next->prev = l2->prev;
l1->next = l2;
l2->prev->next = tmp;
l2->prev = l1;
}
inner_node* createNode(char type, void* item, inner_node* sibling)
{
inner_node
* n
= malloc(sizeof(*n
)); n->type = type;
n->item = item;
n->l.prev = &n->l;
n->l.next = &n->l;
if (sibling != NULL)
linkNodes(&n->l, &sibling->l);
return n;
}
outer_node* createOuterNode(inner_node* child, outer_node* sibling)
{
outer_node
* n
= malloc(sizeof(*n
)); n->l.prev = &n->l;
n->l.next = &n->l;
n->children = child;
if (sibling != NULL)
linkNodes(&n->l, &sibling->l);
return n;
}
void PrintList(links* l, int level)
{
links* l2 = l;
do
{
if (level == 0)
{
outer_node
* n
= (void*)((char*)l2
+ offsetof(outer_node
, l
)); PrintList(&n->children->l, level + 1);
}
else
{
inner_node
* n
= (void*)((char*)l2
+ offsetof(inner_node
, l
)); printf(" type: %d, item: %s\n", n
->type
, (char*)n
->item
); }
l2 = l2->next;
} while (l2 != l);
}
int main(void)
{
outer_node* root =
createOuterNode(
createNode(0, "something",
NULL
),
createOuterNode(
createNode(1, "foo",
createNode(2, "bar",
NULL
)
),
createOuterNode(
createNode(3, "red",
createNode(3, "green",
createNode(3, "blue",
NULL
)
)
),
createOuterNode(
createNode(4, "cat",
createNode(5, "dog",
createNode(6, "raven",
createNode(7, "shark",
NULL
)
)
)
),
NULL
)
)
)
);
PrintList(&root->l, 0);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGRlZi5oPgoKdHlwZWRlZiBzdHJ1Y3QgbGlua3MgewogICAgc3RydWN0IGxpbmtzICogbmV4dDsKICAgIHN0cnVjdCBsaW5rcyAqIHByZXY7Cn0gbGlua3M7Cgp0eXBlZGVmIHN0cnVjdCBvdXRlcl9ub2RlIHsKICBsaW5rcyBsOyAvLyBsaW5rcyB0byBvdXRlcl9ub2RlLmwKICBzdHJ1Y3QgaW5uZXJfbm9kZSAqIGNoaWxkcmVuOwp9IG91dGVyX25vZGU7Cgp0eXBlZGVmIHN0cnVjdCBpbm5lcl9ub2RlIHsKICBsaW5rcyBsOyAvLyBsaW5rcyB0byBpbm5lcl9ub2RlLmwKICBjaGFyIHR5cGU7CiAgdm9pZCAqIGl0ZW07Cn0gaW5uZXJfbm9kZTsKCnZvaWQgbGlua05vZGVzKGxpbmtzKiBsMSwgbGlua3MqIGwyKQp7CiAgbGlua3MqIHRtcCA9IGwxLT5wcmV2OwogIGwxLT5uZXh0LT5wcmV2ID0gbDItPnByZXY7CiAgbDEtPm5leHQgPSBsMjsKCiAgbDItPnByZXYtPm5leHQgPSB0bXA7CiAgbDItPnByZXYgPSBsMTsKfQoKaW5uZXJfbm9kZSogY3JlYXRlTm9kZShjaGFyIHR5cGUsIHZvaWQqIGl0ZW0sIGlubmVyX25vZGUqIHNpYmxpbmcpCnsKICBpbm5lcl9ub2RlKiBuID0gbWFsbG9jKHNpemVvZigqbikpOwogIG4tPnR5cGUgPSB0eXBlOwogIG4tPml0ZW0gPSBpdGVtOwogIG4tPmwucHJldiA9ICZuLT5sOwogIG4tPmwubmV4dCA9ICZuLT5sOwogIGlmIChzaWJsaW5nICE9IE5VTEwpCiAgICBsaW5rTm9kZXMoJm4tPmwsICZzaWJsaW5nLT5sKTsKICByZXR1cm4gbjsKfQoKb3V0ZXJfbm9kZSogY3JlYXRlT3V0ZXJOb2RlKGlubmVyX25vZGUqIGNoaWxkLCBvdXRlcl9ub2RlKiBzaWJsaW5nKQp7CiAgb3V0ZXJfbm9kZSogbiA9IG1hbGxvYyhzaXplb2YoKm4pKTsKICBuLT5sLnByZXYgPSAmbi0+bDsKICBuLT5sLm5leHQgPSAmbi0+bDsKICBuLT5jaGlsZHJlbiA9IGNoaWxkOwogIGlmIChzaWJsaW5nICE9IE5VTEwpCiAgICBsaW5rTm9kZXMoJm4tPmwsICZzaWJsaW5nLT5sKTsKICByZXR1cm4gbjsgIAp9Cgp2b2lkIFByaW50TGlzdChsaW5rcyogbCwgaW50IGxldmVsKQp7CiAgbGlua3MqIGwyID0gbDsKICBkbwogIHsKICAgIGlmIChsZXZlbCA9PSAwKQogICAgewogICAgICBvdXRlcl9ub2RlKiBuID0gKHZvaWQqKSgoY2hhciopbDIgKyBvZmZzZXRvZihvdXRlcl9ub2RlLCBsKSk7CiAgICAgIHByaW50Zigie1xuIik7CiAgICAgIFByaW50TGlzdCgmbi0+Y2hpbGRyZW4tPmwsIGxldmVsICsgMSk7CiAgICAgIHByaW50ZigifVxuIik7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGlubmVyX25vZGUqIG4gPSAodm9pZCopKChjaGFyKilsMiArIG9mZnNldG9mKGlubmVyX25vZGUsIGwpKTsKICAgICAgcHJpbnRmKCIgIHR5cGU6ICVkLCBpdGVtOiAlc1xuIiwgbi0+dHlwZSwgKGNoYXIqKW4tPml0ZW0pOwogICAgfQogICAgbDIgPSBsMi0+bmV4dDsKICB9IHdoaWxlIChsMiAhPSBsKTsKfQoKaW50IG1haW4odm9pZCkKewogIG91dGVyX25vZGUqIHJvb3QgPSAKICAgIGNyZWF0ZU91dGVyTm9kZSgKICAgICAgY3JlYXRlTm9kZSgwLCAic29tZXRoaW5nIiwKICAgICAgICBOVUxMCiAgICAgICksCiAgICAgIGNyZWF0ZU91dGVyTm9kZSgKICAgICAgICBjcmVhdGVOb2RlKDEsICJmb28iLAogICAgICAgICAgY3JlYXRlTm9kZSgyLCAiYmFyIiwKICAgICAgICAgICAgTlVMTAogICAgICAgICAgKQogICAgICAgICksCiAgICAgICAgY3JlYXRlT3V0ZXJOb2RlKAogICAgICAgICAgY3JlYXRlTm9kZSgzLCAicmVkIiwKICAgICAgICAgICAgY3JlYXRlTm9kZSgzLCAiZ3JlZW4iLAogICAgICAgICAgICAgIGNyZWF0ZU5vZGUoMywgImJsdWUiLAogICAgICAgICAgICAgICAgTlVMTAogICAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgICAgKSwKICAgICAgICAgIGNyZWF0ZU91dGVyTm9kZSgKICAgICAgICAgICAgY3JlYXRlTm9kZSg0LCAiY2F0IiwKICAgICAgICAgICAgICBjcmVhdGVOb2RlKDUsICJkb2ciLAogICAgICAgICAgICAgICAgY3JlYXRlTm9kZSg2LCAicmF2ZW4iLAogICAgICAgICAgICAgICAgICBjcmVhdGVOb2RlKDcsICJzaGFyayIsCiAgICAgICAgICAgICAgICAgICAgTlVMTAogICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgKQogICAgICAgICAgICApLAogICAgICAgICAgICBOVUxMCiAgICAgICAgICApCiAgICAgICAgKQogICAgICApCiAgICApOwoKICBQcmludExpc3QoJnJvb3QtPmwsIDApOwoKICByZXR1cm4gMDsKfQo=