src/linked_list.c

changeset 476
60ff4561dc04
parent 475
31bf97fdbf71
child 477
73a93c7a56ae
     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--;

mercurial