1.1 --- a/src/linked_list.c Sat Dec 04 17:38:23 2021 +0100 1.2 +++ b/src/linked_list.c Mon Dec 20 11:17:06 2021 +0100 1.3 @@ -137,7 +137,7 @@ 1.4 } 1.5 } 1.6 1.7 -void *cx_linked_list_remove(void **begin, void **end, ptrdiff_t loc_prev, ptrdiff_t loc_next, void *node) { 1.8 +void cx_linked_list_remove(void **begin, void **end, ptrdiff_t loc_prev, ptrdiff_t loc_next, void *node) { 1.9 assert(loc_next >= 0); 1.10 assert(loc_prev >= 0 || begin != NULL); 1.11 1.12 @@ -150,31 +150,23 @@ 1.13 prev = cx_linked_list_prev(*begin, loc_next, node); 1.14 } 1.15 1.16 - // update links of adjacent nodes 1.17 - if (prev != NULL) { 1.18 + // update next pointer of prev node, or set begin 1.19 + if (prev == NULL) { 1.20 + if (begin != NULL) { 1.21 + *begin = next; 1.22 + } 1.23 + } else { 1.24 CX_LL_PTR(prev, loc_next) = next; 1.25 } 1.26 - if (next != NULL && loc_prev >= 0) { 1.27 + 1.28 + // update prev pointer of next node, or set end 1.29 + if (next == NULL) { 1.30 + if (end != NULL) { 1.31 + *end = prev; 1.32 + } 1.33 + } else if (loc_prev >= 0) { 1.34 CX_LL_PTR(next, loc_prev) = prev; 1.35 } 1.36 - 1.37 - // erase links of the target node 1.38 - CX_LL_PTR(node, loc_next) = NULL; 1.39 - if (loc_prev >= 0) { 1.40 - CX_LL_PTR(node, loc_prev) = NULL; 1.41 - } 1.42 - 1.43 - // update begin, if required 1.44 - if (*begin == node) { 1.45 - *begin = next; 1.46 - } 1.47 - 1.48 - // update end, if required 1.49 - if (end != NULL && *end == node) { 1.50 - *end = prev; 1.51 - } 1.52 - 1.53 - return prev == NULL ? next : prev; 1.54 } 1.55 1.56 size_t cx_linked_list_size(void *node, ptrdiff_t loc_next) { 1.57 @@ -239,8 +231,9 @@ 1.58 return ret; 1.59 } 1.60 1.61 -void cx_linked_list_sort(void **begin, void **end, ptrdiff_t loc_prev, ptrdiff_t loc_next, 1.62 - ptrdiff_t loc_data, int follow_ptr, CxListComparator cmp_func) { 1.63 +void cx_linked_list_sort( /* NOLINT(misc-no-recursion) - purposely recursive function */ 1.64 + void **begin, void **end, ptrdiff_t loc_prev, ptrdiff_t loc_next, 1.65 + ptrdiff_t loc_data, int follow_ptr, CxListComparator cmp_func) { 1.66 assert(begin != NULL); 1.67 assert(loc_next >= 0); 1.68 assert(loc_data >= 0); 1.69 @@ -424,19 +417,9 @@ 1.70 // out-of-bounds check 1.71 if (node == NULL) return 1; 1.72 1.73 - // change left side connection 1.74 - if (node->prev == NULL) { 1.75 - ll->begin = node->next; 1.76 - } else { 1.77 - node->prev->next = node->next; 1.78 - } 1.79 - 1.80 - // change right side connection 1.81 - if (node->next == NULL) { 1.82 - ll->end = node->prev; 1.83 - } else { 1.84 - node->next->prev = node->prev; 1.85 - } 1.86 + // remove 1.87 + cx_linked_list_remove((void **) &ll->begin, (void **) &ll->end, 1.88 + CX_LL_LOC_PREV, CX_LL_LOC_NEXT, node); 1.89 1.90 // adjust size 1.91 list->size--;