Skip to content

Commit 85a640c

Browse files
committed
linkedlist: Remove all nodes matching given data & concatenating two list
1 parent 52abbdb commit 85a640c

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

include/linkedlist.h

+8-2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ void insert_data(LIST_ELEMENT** start, void* data);
1919
*/
2020
void* lookup_data(LIST_ELEMENT* start, void* elem_to_find, int(*cmpfunc)(void*, void*));
2121

22+
/*
23+
* Remove all nodes matching specific data using custom compartor, zeroing its reference
24+
*/
25+
void remove_data(LIST_ELEMENT** start, void* elem_to_remove, int(*cmpfunc)(void*, void*), int free_content);
26+
2227
/*
2328
* user pointer is passed to func directly, for private use
2429
* Prototype of func: void func(void* current_data, void* user);
@@ -31,7 +36,8 @@ void list_traverse(LIST_ELEMENT* start, void(*func)(void*, void*), void* user);
3136
void list_destroy(LIST_ELEMENT** start, int free_content);
3237

3338
/*
34-
* Remove specific data using custom comprator, zeroing its reference
39+
* Concatenate two lists. This will NOT duplicate the nodes in second list.
40+
* So make sure they are always available.
3541
*/
36-
void remove_data(LIST_ELEMENT** start, void* elem_to_remove, int(*cmpfunc)(void*, void*), int free_content);
42+
void list_concat(LIST_ELEMENT** org_list, LIST_ELEMENT* new_list);
3743
#endif

util/linkedlist.c

+11-1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,16 @@ void list_traverse(LIST_ELEMENT* start, void(*func)(void*, void*), void* user) {
4747
}
4848
}
4949

50+
void list_concat(LIST_ELEMENT** org_list, LIST_ELEMENT* new_list) {
51+
if (org_list == NULL) return;
52+
if (*org_list == NULL) {
53+
*org_list = new_list;
54+
return;
55+
}
56+
57+
(find_last_node(*org_list))->next = new_list;
58+
}
59+
5060
void list_destroy(LIST_ELEMENT** ref, int free_content) {
5161
LIST_ELEMENT* curr = NULL, *next = *ref;
5262
while ((curr = next)) {
@@ -70,7 +80,7 @@ void remove_data(LIST_ELEMENT** start, void* elem_to_remove, int(*cmpfunc)(void*
7080
free(curr->content);
7181
}
7282
free(curr);
73-
return;
83+
continue;
7484
}
7585
curr_ref = &curr->next;
7686
}

0 commit comments

Comments
 (0)