From 83210aa292843c67e768f03ba3390efe388505bd Mon Sep 17 00:00:00 2001 From: Dario48 Date: Sat, 6 Dec 2025 12:10:38 +0100 Subject: [PATCH] update --- linked_list.c | 54 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 41 insertions(+), 13 deletions(-) diff --git a/linked_list.c b/linked_list.c index c8c7e11..127bbee 100644 --- a/linked_list.c +++ b/linked_list.c @@ -11,6 +11,7 @@ CREATE_POP(name) \ CREATE_FOREACH(name) \ CREATE_FOREACH_REVERSE(name) \ + CREATE_FOREACH_TWOPASS(name) \ CREATE_DELETE(name) \ CREATE_SAVE(name) \ CREATE_PRINT(name) \ @@ -35,6 +36,7 @@ return -1; \ } \ _list->head->next = second; \ + \ _list->head->val = element; \ return 0; \ } @@ -103,6 +105,24 @@ return _foreach_reverse_##name(_list->head, fun, args); \ } +#define CREATE_FOREACH_TWOPASS(name) \ + int _foreach_twopass_##name( \ + name##_node* node, int (*fun)(name##_node*, void*), void* args \ + ) { \ + if (node) { \ + int ret = fun(node, args); \ + if (ret) return ret; \ + ret = _foreach_twopass_##name(node->next, fun, args); \ + return ret ? ret : fun(node, args); \ + } \ + return 0; \ + } \ + int foreach_twopass_##name( \ + name* _list, int (*fun)(name##_node*, void*), void* args \ + ) { \ + return _foreach_twopass_##name(_list->head, fun, args); \ + } + #define CREATE_DELETE(name) \ int _delete_##name(name##_node* node, void* args) { \ free(node); \ @@ -152,16 +172,24 @@ typedef struct save_args { return 0; \ } -#define CREATE_REMOVE(name, type) \ - int _remove_##name(name##_node* node, void* args) { \ - name##_node* next = node->next; \ - if (!next) return -1; \ - if (next->val != *((type*)args)) return 0; \ - name##_node* new_next = next->next; \ - free(next); \ - node->next = new_next; \ - return 1; \ - } \ - int remove_##name(name* _list, type element) { \ - return foreach_##name(_list, _remove_##name, (void*)&element); \ - } \ No newline at end of file +#define CREATE_REMOVE(name, type) \ + struct _remove_args_##name { \ + int (*eql)(type, type); \ + type to_remove; \ + }; \ + int _remove_##name(name##_node* node, void* args) { \ + name##_node* next = node->next; \ + struct _remove_args_##name* args_typed = \ + (struct _remove_args_##name*)args; \ + if (!next) return -1; \ + if (!args_typed->eql(next->val, *((type*)args))) return 0; \ + name##_node* new_next = next->next; \ + free(next); \ + node->next = new_next; \ + return 1; \ + } \ + int remove_##name(name* _list, type element, int (*eql)(type, type)) { \ + if (!eql) return -2; \ + struct _remove_args_##name args = {.eql = eql, .to_remove = element}; \ + return foreach_##name(_list, _remove_##name, (void*)&args) != 1; \ + }