Home

Awesome

DBSGLINKED version 0.0.23

This is a small C implementation of a generic linked list, to avoid having to create the same code all the time.

LICENSE - GPLv3

See COPYING to get the license or go to http://www.gnu.org/licenses/gpl-3.0.txt

Lib Interface - quick docs

Usage:

A complete use of libraries function can be found in main.c
main.c is not required to use the library.

libglinked_init_list(libglinked_list_t * list, void * (*node_allocator)(void * ), void(*node_deallocator)(void * ));

Prepares the list so it can be used.

libglinked_node_t *libglinked_create_node(libglinked_list_t *list, void *data, void(*dalloc)(void * ));

checks if data is null, if it is, returns null
if data is not null, creates a ligblinked_node_t using list->node_allocator and points
node->data to data;
sets node->data_deallocator to dalloc; the user may use null to not deallocate
the data. Useful for things like literals and constanst
sets node->next to null
returns the newly created node

void libglinked_delete_node(libglinked_list_t *list, libglinked_node_t *node )

 checks if node is null, if it is, returns null
 checks if node->data and node->data_deallocator aren't set
 to null, if not, then calls node->data_deallocator(node->data);
 else if node->data or node->data_deallocator are set to null
 the call will be ignored, however the node_t structure will be deallocated using
 list->node_deallocator that was set using libglinked_init_list

libglinked_node_t *libglinked_enqueue_node(libglinked_list_t *list,linglinked_node_t *node);

 Increments the list items count;
 Appends node to the end of list (fifo)
 Returns the enqueued node, this is useful for a combined call of
 libglinked_enqueue_node with libglinked_create_node;
 Like so:
 libglinked_node_t * catch;
 catch = libglinked_enqueue_node(&list, libglinked_create_node(data));

libglinked_node_t * libglinked_push_node(libglinked_list_t * list, libglinked_node_t * node);

 Increments the list items count
 Appends node to the start of the list (lifo)
 returns the pushed node, this is useful for a combined call
 of libglinked_push_node with libglinked_create_node;
 like so:
 catch = libglinked_push_node(libglinked_list_t * list, libglinked_node_t * node);

libglinked_node_t * libglinked_dequeue_node(libglinked_list_t * list);

 Decrements the list items count (fifo)
 Removes a node from the head of the list and returns it
 Returns NULL if the list is empty

libglinked_node_t * libglinked_pop_node(libglinked_list_t * list);

 Decrements the list items count (lifo)
 Removes a node from the head of the list and returns it
 Returns NULL if the list is empty

void libglinked_delete_list(libglinked_list_t *list );

 dequeues all nodes from the list and deletes them using
 libglinked_delete_node(libglinked_node_t *node );

size_t libglinked_get_num_items(libglinked_list_t *list);

 Gets the count of the current amount of items in the list;

void libglinked_show_node(libglinked_node_t *node, void(*f)(void * ));

 Shows the data stored in the node, using the function passed
 By parameter to it.

void libglinked_show_list(libglinked_list_t *list, void(*f)(void * ));

 Shows the full list nodes using the f function passed by parameter
 to it

void * libglinked_foreach_node(libglinked_list_t * list,void * state, void * ( *action)(void * , void * , void * ), void * param);

 iterates through each node triggering action function.
 like so:
 catch = action(state, node->data, param);
 this way catch will always contain the result of the last
 operation.
 and state can be used to travel data through node calls.
 data, is the node data to be processed/analised
 param is so the user can carry any data into the function needed
 for whatever the process is.
 if action is NULL, the function fails and returns NULL;

libglinked_node_t * libglinked_find_node(libglinked_list_t * list, void * key, bool (*cmp)(void * , void * ));

 This function receives a list where it uses cmp function to determine
 if node->data and key are equal, if so cmp must return true and
 returns the node that was found
 in case of failure returns null
 if cmp is null, fail and return null

libglinked_node_t * libglinked_remove_node(libglinked_list_t * list, void * key, bool (*cmp)(void * , void * ));

 This function receives a list where it uses cmp function to determine
 if node->next->data and key are equal, if so cmp must return true and
 the node which data and key are equal is removed from the list
 in case of failure returns null
 if cmp is null, fail and return null

libglinked_list_t *libglinked_split_list(libglinked_list_t * list, libglinked_list_t * nlist, void * key, bool(*cmp)(void * , void * ));

 This function receives a list where it uses cmp function to determine
 the split location. stores half of the list into nlist, returns
 a pointer to nlist.
 in case of failure returns null
 if list-count < 2 , no possible split, returns null
 if cmp is null, no possible compare, returns null

libglinked_list_t * libglinked_join_list(libglinked_list_t * list, libglinked_list_t * slist, void * key, bool(*cmp)(void * ,void * ));

 this function joins slist to list
 if key and cmp are null, slist is joined at the end of list
 if key is null, but cmp isn't or vice versa, fails, return null
 if list is empty, list becomes slist, slist is invalidated, meaning
 needs to be re set with libglinked_init_list again.
 if node_allocator or node_dellocator of lists are different, fails,
 incompatible lists
 if success slist is invalidated and list is ready to use. for
 convinience list is also returned

void libglinked_reverse_list(libglinked_list_t *list)

 Reverses the linked list and sets list as the head;

TODO

A complete todo list can be found in TODO file
This file also contains information of which version received
a specific feature