107 assert(retCode == 0);
109 list->
head.item = NULL;
111 list->
head.prev = NULL;
112 list->
tail.item = NULL;
114 list->
tail.next = NULL;
120 assert(list != NULL);
129 assert(list != NULL);
140 assert(list != NULL);
148 bnode->next = newNode;
149 newNode->prev = bnode;
150 newNode->next = temp;
151 temp->prev = newNode;
163 assert(list != NULL);
171 anode->prev = newNode;
172 newNode->next = anode;
173 newNode->prev = temp;
174 temp->next = newNode;
186 assert(list != NULL);
187 assert(dnode != &list->
head);
188 assert(dnode != &list->
tail);
190 if (!list || dnode == &list->
head || dnode == &list->
tail || !dnode)
193 dnode->prev->next = dnode->next;
194 dnode->next->prev = dnode->prev;
212 for (dnode = list->
head.next; dnode != &list->
tail;) {
224 assert(list != NULL);
232 return list->
head.next;
236 assert(list != NULL);
244 return list->
tail.prev;
248 assert(list != NULL);
249 assert(node != NULL);
253 if (node->next == &list->
tail)
260 assert(list != NULL);
261 assert(node != NULL);
266 if (node->prev == &list->
head)
282 finger = start->next;
286 while (finger != &list->
tail) {
288 if (list->
cmp_func(item, finger->item))
291 if (item == finger->item)
294 finger = finger->next;
301 assert(list != NULL);
int FreeListInit(FreeList *free_list, size_t elementSize, int maxFreeListLength)
Initializes Free List.
int FreeListFree(FreeList *free_list, void *element)
Returns an item to the Free List.
void * FreeListAlloc(FreeList *free_list)
Allocates chunk of set size.
int FreeListDestroy(FreeList *free_list)
Releases the resources stored with the free list.
long ListSize(LinkedList *list)
Returns the size of the list.
int ListDestroy(LinkedList *list, int freeItem)
Removes all memory associated with list nodes. Does not free LinkedList *list.
ListNode * ListPrev(LinkedList *list, ListNode *node)
Returns the previous item in the list.
void * ListDelNode(LinkedList *list, ListNode *dnode, int freeItem)
Removes a node from the list. The memory for the node is freed.
ListNode * ListAddBefore(LinkedList *list, void *item, ListNode *anode)
Adds a node before the specified node. Node gets added immediately before anode.
ListNode * ListNext(LinkedList *list, ListNode *node)
Returns the next item in the list.
ListNode * ListAddAfter(LinkedList *list, void *item, ListNode *bnode)
Adds a node after the specified node. Node gets added immediately after bnode.
ListNode * ListHead(LinkedList *list)
Returns the head of the list.
ListNode * ListAddHead(LinkedList *list, void *item)
Adds a node to the head of the list. Node gets immediately after list head.
ListNode * ListAddTail(LinkedList *list, void *item)
Adds a node to the tail of the list. Node gets added immediately before list.tail.
ListNode * ListTail(LinkedList *list)
Returns the tail of the list.
ListNode * ListFind(LinkedList *list, ListNode *start, void *item)
Finds the specified item in the list.
int ListInit(LinkedList *list, cmp_routine cmp_func, free_function free_func)
Initializes LinkedList. Must be called first and only once for List.
constexpr int FREELISTSIZE
Size of a free list.
Manage a linked list (for internal use only).
cmp_routine cmp_func
compare function to use
ListNode head
head, first item is stored at: head->next
free_function free_func
free function to use
FreeList freeNodeList
free list to use
void(* free_function)(void *arg)
Function for freeing list items.
ListNode tail
tail, last item is stored at: tail->prev
int(* cmp_routine)(void *itemA, void *itemB)
Function for comparing list items. Returns 1 if itemA==itemB.
Linked list node. Stores generic item and pointers to next and prev.
Linked list (no protection).
int freeListNode(ListNode *node, LinkedList *list)
Free list node.
ListNode * CreateListNode(void *item, LinkedList *list)
Dynamically creates a list node.