aboutsummaryrefslogtreecommitdiff
path: root/Semestr 4/sieci/pracownia2/router/linked_list.c
diff options
context:
space:
mode:
Diffstat (limited to 'Semestr 4/sieci/pracownia2/router/linked_list.c')
-rw-r--r--Semestr 4/sieci/pracownia2/router/linked_list.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/Semestr 4/sieci/pracownia2/router/linked_list.c b/Semestr 4/sieci/pracownia2/router/linked_list.c
index b6b5225..f3bccc9 100644
--- a/Semestr 4/sieci/pracownia2/router/linked_list.c
+++ b/Semestr 4/sieci/pracownia2/router/linked_list.c
@@ -16,18 +16,21 @@ void _insert(node_t **head, void *data, size_t data_size) {
*head = new_node;
}
+void _free_node(node_t *node) {
+ free(node->data);
+ free(node);
+}
+
void _erase(node_t **head) {
node_t *next_node = _next(*head);
- free((*head)->data);
- free(*head);
+ _free_node(*head);
*head = next_node;
}
void _free_list(node_t *head) {
if (head == NULL) return;
_free_list(head->next);
- free(head->data);
- free(head);
+ _free_node(head);
}
list_t create_list() {
@@ -45,11 +48,25 @@ void erase(list_t *list) {
_erase(&list->head);
}
+void erase_it(list_t *list) {
+ if(list->it == NULL) return;
+ if(list->prev_it == NULL) {
+ erase(list);
+ reset(list);
+ return;
+ }
+ list->prev_it->next = _next(list->it);
+ _free_node(list->it);
+ list->it = list->prev_it->next;
+}
+
void iterate(list_t *list) {
+ list->prev_it = list->it;
list->it = _next(list->it);
}
void reset(list_t *list) {
+ list->prev_it = NULL;
list->it = list->head;
}