diff options
| author | Tyge Løvset <[email protected]> | 2023-01-05 17:05:55 +0100 |
|---|---|---|
| committer | Tyge Løvset <[email protected]> | 2023-01-05 17:05:55 +0100 |
| commit | e8c0cf85e8c8b38369cdaed301cf000c836e9c54 (patch) | |
| tree | dabbf42b0badfed9bd1d24d440a62b07ca93e9f1 /misc/examples/intrusive.c | |
| parent | 45bfcdc35788988f5c8b2b53a62f7fb8c5e1cf50 (diff) | |
| download | STC-modified-e8c0cf85e8c8b38369cdaed301cf000c836e9c54.tar.gz STC-modified-e8c0cf85e8c8b38369cdaed301cf000c836e9c54.zip | |
Fixed example. Not possible to remove shared node in two single linked lists (requires doubly linked).
Diffstat (limited to 'misc/examples/intrusive.c')
| -rw-r--r-- | misc/examples/intrusive.c | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/misc/examples/intrusive.c b/misc/examples/intrusive.c index 7e7a7b39..20a37055 100644 --- a/misc/examples/intrusive.c +++ b/misc/examples/intrusive.c @@ -1,4 +1,4 @@ -// Example of intrusive list by using the node API. +// Example of intrusive/shared list-nodes by using the node API. #include <stdio.h> @@ -13,11 +13,11 @@ #include <stc/clist.h> void printLists(Inner inner, Outer outer) { - printf("inner:"); + printf(" inner:"); c_FOREACH (i, Inner, inner) printf(" %d", *i.ref); - printf("\nouter:"); + printf("\n outer:"); c_FOREACH (i, Outer, outer) printf(" %d", i.ref->value); puts(""); @@ -29,26 +29,26 @@ int main() { Inner inner = Inner_init(); // do not destroy, outer will destroy the shared nodes. - c_FORLIST (i, int, {6, 9, 3, 1, 7, 4, 5, 2, 8}) - Outer_push_back(&outer, (Inner_node){NULL, *i.ref}); + c_FORLIST (i, int, {6, 9, 3, 1, 7, 4, 5, 2, 8}) { + Inner_node* node = Outer_push_back(&outer, (Inner_node){0}); + node->value = *i.ref; + } c_FOREACH (i, Outer, outer) - Inner_push_node_back(&inner, Inner_get_node(&i.ref->value)); + Inner_push_node_back(&inner, i.ref); printLists(inner, outer); - puts("sort inner"); + puts("Sort inner"); Inner_sort(&inner); printLists(inner, outer); - puts("remove 5 from both lists in O(1) time"); - Inner_iter it1 = Inner_find(&inner, 5); + puts("Remove odd numbers from inner list"); - if (it1.ref) { - Inner_unlink_node_after(&inner, it1.prev); - free(Outer_unlink_node_after(&outer, Outer_get_node(it1.prev))); - } + c_FOREACH (i, Inner, inner) + if (*i.ref & 1) + Inner_unlink_node_after(&inner, i.prev); printLists(inner, outer); } |
