diff options
author | pgen <p.gen.progs@gmail.com> | 2019-08-28 19:42:25 +0200 |
---|---|---|
committer | pgen <p.gen.progs@gmail.com> | 2019-08-28 22:45:16 +0200 |
commit | f5d24933b42aaf50fdc6f01bc7047ad9bc340c59 (patch) | |
tree | e45a448e2dc1847cbc2e1d85dc0181dedddd0c74 /list.c | |
parent | fda54458730beb3d7314645b2a702b51f539a7b0 (diff) |
Simplify some list functions
Diffstat (limited to 'list.c')
-rw-r--r-- | list.c | 132 |
1 files changed, 58 insertions, 74 deletions
@@ -59,69 +59,59 @@ ll_new_node(void) /* ==================================================================== */ /* Append a new node filled with its data at the end of the linked list */ /* The user is responsible for the memory management of the data */ +/* */ +/* Note: list is assumed to be initialized by ll_new() */ /* ==================================================================== */ -int +void ll_append(ll_t * const list, void * const data) { - int ret = 1; ll_node_t * node; - if (list) - { - node = ll_new_node(); - if (node) - { - node->data = data; - node->next = NULL; + node = ll_new_node(); /* ll_new_node cannot return NULL because it * + * uses xmalloc which does not return if there * + * is an allocation error. */ - node->prev = list->tail; - if (list->tail) - list->tail->next = node; - else - list->head = node; + node->data = data; + node->next = NULL; - list->tail = node; + node->prev = list->tail; + if (list->tail) + list->tail->next = node; + else + list->head = node; - ++list->len; - ret = 0; - } - } + list->tail = node; - return ret; + ++list->len; } /* =================================================================== */ /* Put a new node filled with its data at the beginning of the linked */ /* list. The user is responsible for the memory management of the data */ +/* */ +/* Note: list is assumed to be initialized by ll_new() */ /* =================================================================== */ -int +void ll_prepend(ll_t * const list, void * const data) { - int ret = 1; ll_node_t * node; - if (list) - { - node = ll_new_node(); - if (node) - { - node->data = data; - node->prev = NULL; + node = ll_new_node(); /* ll_new_node cannot return NULL because it * + * uses xmalloc which does not return if there * + * is an allocation error. */ - node->next = list->head; - if (list->head) - list->head->prev = node; - else - list->tail = node; + node->data = data; + node->prev = NULL; - list->head = node; + node->next = list->head; + if (list->head) + list->head->prev = node; + else + list->tail = node; - ++list->len; - ret = 0; - } - } + list->head = node; - return ret; + ++list->len; } /* ======================================================= */ @@ -132,24 +122,21 @@ ll_insert_before(ll_t * const list, ll_node_t * node, void * const data) { ll_node_t * new_node; - if (list) + if (node->prev == NULL) + ll_prepend(list, data); + else { - if (node->prev == NULL) - ll_prepend(list, data); - else - { - new_node = ll_new_node(); - if (new_node) - { - new_node->data = data; - new_node->next = node; - new_node->prev = node->prev; - node->prev->next = new_node; - node->prev = new_node; - - ++list->len; - } - } + node = ll_new_node(); /* ll_new_node cannot return NULL because it * + * uses xmalloc which does not return if there * + * is an allocation error. */ + + new_node->data = data; + new_node->next = node; + new_node->prev = node->prev; + node->prev->next = new_node; + node->prev = new_node; + + ++list->len; } } @@ -161,24 +148,21 @@ ll_insert_after(ll_t * const list, ll_node_t * node, void * const data) { ll_node_t * new_node; - if (list) + if (node->next == NULL) + ll_append(list, data); + else { - if (node->next == NULL) - ll_append(list, data); - else - { - new_node = ll_new_node(); - if (new_node) - { - new_node->data = data; - new_node->prev = node; - new_node->next = node->next; - node->next->prev = new_node; - node->next = new_node; - - ++list->len; - } - } + node = ll_new_node(); /* ll_new_node cannot return NULL because it * + * uses xmalloc which does not return if there * + * is an allocation error. */ + + new_node->data = data; + new_node->prev = node; + new_node->next = node->next; + node->next->prev = new_node; + node->next = new_node; + + ++list->len; } } |