docs/Writerside/topics/linked_list.h.md

Wed, 03 Dec 2025 00:01:17 +0100

author
Mike Becker <universe@uap-core.de>
date
Wed, 03 Dec 2025 00:01:17 +0100
changeset 1537
f60a73d2ad01
parent 1424
563033aa998c
permissions
-rw-r--r--

add documentation for cx_linked_list_extra_data()

fixes #764

1143
0559812df10c assign proper names to the documentation topics
Mike Becker <universe@uap-core.de>
parents: 1142
diff changeset
1 # Linked List
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 On top of implementing the list interface, this header also defines several low-level functions that
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 work with arbitrary structures.
1241
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
5
1390
ff077f793c5d kv-list: add documentation
Mike Becker <universe@uap-core.de>
parents: 1245
diff changeset
6 The high-level [list interface](list.h.md) is documented on a separate page and explains how lists are used
1245
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1241
diff changeset
7 that are created by one of the following functions.
1241
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
8
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
9 ```C
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
10 #include <cx/linked_list.h>
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
11
1537
f60a73d2ad01 add documentation for cx_linked_list_extra_data()
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
12 typedef struct cx_linked_list_s cx_linked_list;
f60a73d2ad01 add documentation for cx_linked_list_extra_data()
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
13
1241
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
14 CxList *cxLinkedListCreate(const CxAllocator *allocator,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
15 cx_compare_func comparator, size_t elem_size);
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
16
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
17 CxList *cxLinkedListCreateSimple(size_t elem_size);
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
18 ```
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
19
1537
f60a73d2ad01 add documentation for cx_linked_list_extra_data()
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
20 If you are using high-level linked lists to implement your own list structure,
f60a73d2ad01 add documentation for cx_linked_list_extra_data()
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
21 it might be necessary to store additional data in each node that does not belong to the elements.
f60a73d2ad01 add documentation for cx_linked_list_extra_data()
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
22 For this purpose, there exists the following function.
f60a73d2ad01 add documentation for cx_linked_list_extra_data()
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
23
f60a73d2ad01 add documentation for cx_linked_list_extra_data()
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
24 ```C
f60a73d2ad01 add documentation for cx_linked_list_extra_data()
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
25 void cx_linked_list_extra_data(cx_linked_list *list, size_t len);
f60a73d2ad01 add documentation for cx_linked_list_extra_data()
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
26 ```
f60a73d2ad01 add documentation for cx_linked_list_extra_data()
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
27
f60a73d2ad01 add documentation for cx_linked_list_extra_data()
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
28 It instructs the linked list to allocate `len` bytes of extra data when allocating a node.
f60a73d2ad01 add documentation for cx_linked_list_extra_data()
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
29 The location offset of the extra data is stored in the `loc_extra` field of the linked list.
f60a73d2ad01 add documentation for cx_linked_list_extra_data()
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
30
f60a73d2ad01 add documentation for cx_linked_list_extra_data()
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
31 > The [key/value list](kv_list.h.md) uses this technique to store the `CxHashKey` as extra data in each node.
1241
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
32
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
33 ## Basic Structure
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
34
1537
f60a73d2ad01 add documentation for cx_linked_list_extra_data()
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
35 This section and the remaining content of this page describe the low-level functions for linked lists.
f60a73d2ad01 add documentation for cx_linked_list_extra_data()
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
36
f60a73d2ad01 add documentation for cx_linked_list_extra_data()
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
37 Those work with nodes that have the following structure.
f60a73d2ad01 add documentation for cx_linked_list_extra_data()
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
38
1241
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
39 ```C
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
40 struct node {
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
41 node *next;
1241
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
42 node *prev; // optional
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
43 // ... the element data goes here ...
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
44 };
1241
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
45 ```
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
46
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
47 Each node must have at least one pointer that contains the address of the subsequent node.
1537
f60a73d2ad01 add documentation for cx_linked_list_extra_data()
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
48 Optionally, for doubly linked lists, there may be a second pointer that points to the predecessor.
1241
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
49
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
50 The functions usually expect a `loc_prev` and a `loc_next` offset.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
51 In the example structure from above you can obtain them with `offsetof(struct node, next)` and `offsetof(struct node, prev)`.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
52 In all functions, `loc_prev` is optional in the sense, that when you do not have a `prev` pointer, you can specify a negative value.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
53 When a function expects a `loc_advance` offset, you can freely choose if you want to pass the offset of the `next` or the `prev` pointer,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
54 depending on what you want to do.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
55
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
56 If a function expects a `void** begin` and a `void** end` pointer, they are usually both optional, unless otherwise specified.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
57 If non-`NULL`, they point to the variables where the addresses of the first, or the last, node of a list are stored, respectively.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
58 When a list operation results in a new first (or last) node, the addresses are overwritten.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
59 In simple scenarios, you usually keep a pointer to the beginning of a list, and hence you would usually pass `NULL` to the `end` argument.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
60 If you are designing a stack-like linked-list, it may happen that you only want to store the last node of a list (the top of stack),
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
61 hence passing `NULL` to the `begin` argument and the address of your top-of-stack pointer to the `end` argument.
1537
f60a73d2ad01 add documentation for cx_linked_list_extra_data()
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
62 Either way, most functions allow you a big deal of flexibility — please still read the documentation of each function carefully to learn which combinations are allowed.
1241
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
63
1537
f60a73d2ad01 add documentation for cx_linked_list_extra_data()
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
64 When you are working with a singly linked list, it is still sometimes necessary to access the predecessor of a node.
1241
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
65 In the absence of a `prev` pointer, the only chance is to start at the beginning of the list and search for that node.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
66 This is exactly what `cx_linked_list_prev()` does.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
67 ```C
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
68 #include <cx/linked_list.h>
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
69
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
70 void *cx_linked_list_prev(const void *begin,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
71 ptrdiff_t loc_next, const void *node);
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
72 ```
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
73
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
74 Starting with the `begin` node, the function checks if the next node is exactly the `node` (by pointer-comparison).
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
75 If true, the function terminates and returns the current node.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
76 Otherwise, it moves on with the search.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
77 If `begin` is already the searched `node`, this function immediately returns `NULL` as there is no predecessor.
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
78 Note carefully that the behavior of this function is not defined when `node` is not contained in the list that starts with `begin`.
1241
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
79
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
80 > It is advisable to use the low-level functions inside own custom functions that you define particularly for your lists.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
81 > Otherwise you will get a lot of boilerplate code when specifying the offsets to the pointers in your node structure in every call
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
82 > across your entire program.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
83
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
84 ## Link and Unlink
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
85
1241
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
86 ```C
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
87 #include <cx/linked_list.h>
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
88
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
89 void cx_linked_list_link(void *left, void *right,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
90 ptrdiff_t loc_prev, ptrdiff_t loc_next);
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
91
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
92 void cx_linked_list_unlink(void *left, void *right,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
93 ptrdiff_t loc_prev, ptrdiff_t loc_next);
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
94 ```
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
95
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
96 When you have two nodes `left` and `right` you can link or unlink them with the functions shown above.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
97
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
98 When linking `left` and `right` you should make sure that `left` as currently no successor and `right` has no predecessor,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
99 because the pointers will be overwritten without unlinking possible existing links, first.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
100
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
101 On the other hand, when unlinking `left` and `right`, they must actually be linked right now.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
102 This is even asserted in debug builds.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
103
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
104 Usually you should not need those functions when working with the [insert](#insert) and [remove](#remove) functions below.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
105
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
106 ## Insert
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
107
1241
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
108 ```C
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
109 #include <cx/linked_list.h>
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
110
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
111 void cx_linked_list_add(void **begin, void **end,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
112 ptrdiff_t loc_prev, ptrdiff_t loc_next,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
113 void *new_node);
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
114
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
115 void cx_linked_list_prepend(void **begin, void **end,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
116 ptrdiff_t loc_prev, ptrdiff_t loc_next,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
117 void *new_node);
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
118
1241
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
119 void cx_linked_list_insert(void **begin, void **end,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
120 ptrdiff_t loc_prev, ptrdiff_t loc_next,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
121 void *node, void *new_node);
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
122
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
123 void cx_linked_list_insert_chain(void **begin, void **end,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
124 ptrdiff_t loc_prev, ptrdiff_t loc_next,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
125 void *node, void *insert_begin, void *insert_end);
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
126
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
127 void cx_linked_list_insert_sorted(void **begin, void **end,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
128 ptrdiff_t loc_prev, ptrdiff_t loc_next,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
129 void *new_node, cx_compare_func cmp_func);
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
130
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
131 void cx_linked_list_insert_sorted_chain(void **begin, void **end,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
132 ptrdiff_t loc_prev, ptrdiff_t loc_next,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
133 void *insert_begin, cx_compare_func cmp_func);
1419
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
134
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
135 int cx_linked_list_insert_unique(void **begin, void **end,
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
136 ptrdiff_t loc_prev, ptrdiff_t loc_next,
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
137 void *new_node, cx_compare_func cmp_func);
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
138
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
139 void *cx_linked_list_insert_unique_chain(void **begin, void **end,
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
140 ptrdiff_t loc_prev, ptrdiff_t loc_next,
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
141 void *insert_begin, cx_compare_func cmp_func);
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
142 ```
1142
9437530176bc add symbols that need documentation as TODOs
Mike Becker <universe@uap-core.de>
parents: 1141
diff changeset
143
1241
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
144 The above functions can be used to insert one or more elements into a linked list.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
145
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
146 The functions `cx_linked_list_add()` and `cx_linked_list_prepend()` add the `new_node` to the beginning, or the end, of the list, respectively.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
147 Either `begin` or `end` needs to be non-`NULL`.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
148 If you pass `NULL` to `end` in `cx_linked_list_add()`, you have to specify `begin` and `loc_next`, instead.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
149 On the other hand, if you pass `NULL` to `begin` in `cx_linked_list_prepend()`, you have to specify `end` and `loc_prev`, instead.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
150
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
151 The function `cx_linked_list_insert()` behaves like `cx_linked_list_insert_chain()` where both
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
152 `insert_begin` and `insert_end` are set to `new_node`.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
153
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
154 The function `cx_linked_list_insert_chain()` inserts the chain of nodes starting with `insert_begin` after the node `node`.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
155 If `insert_end` is `NULL`, the end is automatically detected, in which case `loc_next` must be available.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
156 If you pass `NULL` to `node`, the entire chain is prepended to the list, in which case either `begin` must be non-`NULL`,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
157 or `end` must be non-`NULL` and `loc_prev` must be available to determine the start of the list.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
158
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
159 The functions `cx_linked_list_insert_sorted()` and `cx_linked_list_insert_sorted_chain()` are equivalent,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
160 except that `begin` and `loc_next` are always required, and the target list must already be sorted.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
161 The order is determined by the `cmp_func` to which the pointers to the nodes are passed.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
162
1419
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
163 The functions `cx_linked_list_insert_unique()` and `cx_linked_list_insert_unique_chain()` are similar to
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
164 `cx_linked_list_insert_sorted()` and `cx_linked_list_insert_sorted_chain()`, except that they only insert the node
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
165 if it is not already contained in the list.
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
166 When a duplicate is found, `cx_linked_list_insert_unique()` returns non-zero and `cx_linked_list_insert_unique_chain()`
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
167 returns a pointer to a new chain starting with the first node that was not inserted.
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
168
1241
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
169 > The `cx_linked_list_insert_sorted_chain()` function does not have an `insert_end` argument, because
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
170 > it cannot take advantage of simply inserting the entire chain as-is, as the chain might need to be broken
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
171 > to maintain the sort order.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
172
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
173 ## Access and Find
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
174
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
175 ```C
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
176 #include <cx/linked_list.h>
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
177
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
178 void *cx_linked_list_first(const void *node, ptrdiff_t loc_prev);
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
179
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
180 void *cx_linked_list_last(const void *node, ptrdiff_t loc_next);
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
181
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
182 void *cx_linked_list_at(const void *start,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
183 size_t start_index, ptrdiff_t loc_advance, size_t index);
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
184
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
185 void *cx_linked_list_find(const void *start,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
186 ptrdiff_t loc_advance, ptrdiff_t loc_data,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
187 cx_compare_func cmp_func,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
188 const void *elem, size_t *found_index);
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
189
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
190 size_t cx_linked_list_size(const void *node, ptrdiff_t loc_next);
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
191 ```
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
192
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
193 The functions `cx_linked_list_first()` and `cx_linked_list_last()` can be used to find the first, or last,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
194 node in your list in case you are not keeping track of them separately.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
195 They can start at an arbitrary node within the list.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
196
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
197 The function `cx_linked_list_at()` starts at an arbitrary node `start` which is _specified_ to have the index `start_index`,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
198 and finds the node at `index`.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
199 If `index` is larger than `start_index`, you must pass the offset of the `next` pointer to `loc_advanced`.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
200 On the other hand, if `index` is smaller than `start_index`, you must pass the offset of the `prev` pointer.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
201 If both indices match, the function simply returns `start`.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
202 And if `index` is out-of-bounds, the function returns `NULL`.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
203
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
204 The function `cx_linked_list_find()` starts a search at the `start` node and compares each element with `elem`.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
205 If `loc_data` is non-zero, the data-type of `elem` must be a pointer to data which is compatible to the data located at the specified offset in the node.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
206 If `loc_data` is zero, `elem` is expected to point to a node structure (which is usually artificially created for the sake of comparison and not contained in the list).
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
207 When the searched element is found, a pointer to the node is returned and the index (assuming `start` has index zero) is written to the optional `found_index`, if non-`NULL`.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
208
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
209 The size of a list, or sub-list, can be determined with `cx_linked_list_size()` which may start at an arbitrary `node´ in the list.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
210
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
211 > A creative way of using `cx_linked_list_size()` in doubly-linked lists is to use the offset of the `prev` pointer
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
212 > for `loc_next`, in which case the function will return the index of the node within the list plus one.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
213
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
214 ## Remove
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
215
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
216 ```C
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
217 #include <cx/linked_list.h>
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
218
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
219 void cx_linked_list_remove(void **begin, void **end,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
220 ptrdiff_t loc_prev, ptrdiff_t loc_next, void *node);
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
221
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
222 size_t cx_linked_list_remove_chain(void **begin, void **end,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
223 ptrdiff_t loc_prev, ptrdiff_t loc_next,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
224 void *node, size_t num);
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
225 ```
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
226
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
227 You can either remove a single element or a specified number of subsequent elements from the list.
1241
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
228
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
229 The function `cx_linked_list_remove()` is equivalent to `cx_linked_list_remove_chain()` where `num` is set to one.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
230
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
231 The function `cx_linked_list_remove_chain()` removes up to `num` number of nodes from the list where `node` is contained, including `node` itself.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
232 It returns the actual number of removed elements, which might be smaller when the list does not contain at least `num` elements.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
233
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
234 The `prev` and `next` pointers of _all_ removed nodes are kept completely intact, allowing traversal within the removed chain,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
235 as well as identifying the formerly adjacent nodes with the list from which the chain was removed.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
236
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
237 > Both `begin` and `end` pointers are optional, if you specify both `loc_prev` and `loc_next`.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
238 > In case your list does not have a `prev` pointer, specifying `begin` is mandatory (because there would be no other way to determine the predecessor of `node`).
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
239 >{style="note"}
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
240
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
241 > While specifying _only_ `loc_prev` and `end` is technically illegal, you can simply swap roles
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
242 > and use the offset of your `prev` pointer as `loc_next` and the address of your `end` pointer as `begin`.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
243 > The list is then traversed backwards, but otherwise everything works as expected.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
244
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
245 ## Reorder
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
246
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
247 ```C
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
248 #include <cx/linked_list.h>
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
249
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
250 void cx_linked_list_reverse(void **begin, void **end,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
251 ptrdiff_t loc_prev, ptrdiff_t loc_next);
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
252
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
253 void cx_linked_list_sort(void **begin, void **end,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
254 ptrdiff_t loc_prev, ptrdiff_t loc_next,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
255 ptrdiff_t loc_data, cx_compare_func cmp_func);
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
256 ```
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
257
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
258 The function `cx_linked_list_reverse()` swaps all links of all nodes in the specified list, effectively reversing the order of elements.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
259
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
260 The function `cx_linked_list_sort()` uses a recursive _natural mergesort_ implementation to sort the list with respect to the specified `cmp_fnc`.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
261 The non-negative `loc_data` offset is used to calculate the pointers that are passed to the compare function.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
262 If you choose `loc_data` to be zero, the pointers to the nodes themselves are passed.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
263
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
264 > The `begin` pointer is required in all of the above functions while the `end` pointer is still optional.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
265 > {style="note"}
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
266
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
267 > Sorting uses [small buffer optimization](install.md#small-buffer-optimizations) for small list sizes.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
268 > If a list contains no more than `CX_LINKED_LIST_SORT_SBO_SIZE` number of elements, no additional heap memory is allocated during the entire operation.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
269 > Otherwise, merge operations still do not allocate extra memory as long as the length of the merged sub-list is not larger.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
270
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
271 ## Compare
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
272
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
273 ```C
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
274 #include <cx/linked_list.h>
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
275
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
276 int cx_linked_list_compare(
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
277 const void *begin_left, const void *begin_right,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
278 ptrdiff_t loc_advance, ptrdiff_t loc_data,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
279 cx_compare_func cmp_func
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
280 );
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
281 ```
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
282
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
283 For comparing two linked list, you need to specify where to start,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
284 and the offsets for the pointer to the next node and the data.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
285
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
286 In the natural case, `begin_left` and `begin_right` point to the first node of either list,
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
287 and `loc_advance` is the offset of the `next` pointer.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
288 But it is also possible to start with the _last_ node of both lists and use the `prev` pointer to compare them backwards.
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
289
ebcc08023c33 complete linked_list.h docu
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
290 The `loc_data` offset is used to calculate the pointer that is passed to the `cmp_fnc`.
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
291 This can either be the offset of a specific field in the struct or simply zero, in which case the pointers to the nodes themselves are passed to the compare function.
1190
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
292
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
293 <seealso>
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
294 <category ref="apidoc">
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
295 <a href="https://ucx.sourceforge.io/api/linked__list_8h.html">linked_list.h</a>
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
296 </category>
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
297 </seealso>

mercurial