Wed, 03 Dec 2025 00:01:17 +0100
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 | 2 | |
| 3 | On top of implementing the list interface, this header also defines several low-level functions that | |
| 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 | 40 | struct node { |
| 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 | 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 | 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 | 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 | 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 | 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> |