2021-02-01 22:06:37 +00:00
|
|
|
#include <string.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
2021-12-21 14:48:29 +00:00
|
|
|
#include "lflinkedlist.h"
|
2021-02-01 22:06:37 +00:00
|
|
|
|
2022-03-28 17:52:16 +00:00
|
|
|
void ll_init(List *list, void (*destroy)(void *data)) {
|
2021-02-01 22:06:37 +00:00
|
|
|
list->size = 0;
|
|
|
|
list->destroy = destroy;
|
|
|
|
list->head = NULL;
|
|
|
|
list->tail = NULL;
|
|
|
|
}
|
|
|
|
|
2022-03-28 17:52:16 +00:00
|
|
|
void ll_destroy(List *list) {
|
|
|
|
void *data;
|
2021-02-01 22:06:37 +00:00
|
|
|
while (list->size > 0) {
|
2022-03-28 17:52:16 +00:00
|
|
|
if (ll_remove(list, list->tail, (void **) &data) == 0 && list->destroy != NULL) {
|
2021-02-01 22:06:37 +00:00
|
|
|
list->destroy(data);
|
|
|
|
}
|
|
|
|
}
|
2021-02-01 22:27:01 +00:00
|
|
|
memset(list, 0, sizeof(List));
|
2021-02-01 22:06:37 +00:00
|
|
|
}
|
|
|
|
|
2022-03-28 17:52:16 +00:00
|
|
|
int ll_ins_next(List *list, ListNode *node, const void *data) {
|
|
|
|
ListNode *new_node;
|
2021-02-01 22:06:37 +00:00
|
|
|
if (node == NULL && list->size != 0) {
|
|
|
|
return -1;
|
|
|
|
}
|
2021-02-01 22:27:01 +00:00
|
|
|
if ((new_node = malloc(sizeof(ListNode))) == NULL) {
|
2021-02-01 22:06:37 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2022-03-28 17:52:16 +00:00
|
|
|
new_node->data = (void *) data;
|
2021-02-01 22:06:37 +00:00
|
|
|
if (list->size == 0) {
|
|
|
|
list->head = new_node;
|
|
|
|
list->head->prev = NULL;
|
|
|
|
list->head->next = NULL;
|
|
|
|
list->tail = new_node;
|
|
|
|
} else {
|
|
|
|
new_node->next = node->next;
|
|
|
|
new_node->prev = node;
|
|
|
|
if (node->next == NULL) {
|
|
|
|
list->tail = new_node;
|
|
|
|
} else {
|
|
|
|
node->next->prev = new_node;
|
|
|
|
}
|
|
|
|
node->next = new_node;
|
|
|
|
}
|
|
|
|
|
|
|
|
list->size++;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2022-03-28 17:52:16 +00:00
|
|
|
int ll_ins_prev(List *list, ListNode *node, const void *data) {
|
|
|
|
ListNode *new_node;
|
2021-02-01 22:06:37 +00:00
|
|
|
if (node == NULL && list->size != 0) {
|
|
|
|
return -1;
|
|
|
|
}
|
2021-02-01 22:27:01 +00:00
|
|
|
if ((new_node = malloc(sizeof(ListNode))) == NULL) {
|
2021-02-01 22:06:37 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2022-03-28 17:52:16 +00:00
|
|
|
new_node->data = (void *) data;
|
2021-02-01 22:06:37 +00:00
|
|
|
if (list->size == 0) {
|
|
|
|
list->head = new_node;
|
|
|
|
list->head->prev = NULL;
|
|
|
|
list->head->next = NULL;
|
|
|
|
list->tail = new_node;
|
|
|
|
} else {
|
|
|
|
new_node->next = node;
|
|
|
|
new_node->prev = node->prev;
|
|
|
|
if (node->prev == NULL) {
|
|
|
|
list->head = new_node;
|
|
|
|
} else {
|
|
|
|
node->prev->next = new_node;
|
|
|
|
}
|
|
|
|
node->prev = new_node;
|
|
|
|
}
|
|
|
|
|
|
|
|
list->size++;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2022-03-28 17:52:16 +00:00
|
|
|
int ll_remove(List *list, ListNode *node, void **data) {
|
2021-02-01 22:06:37 +00:00
|
|
|
if (node == NULL || list->size == 0) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
*data = node->data;
|
|
|
|
if (node == list->head) {
|
|
|
|
list->head = node->next;
|
|
|
|
if (list->head == NULL) {
|
|
|
|
list->tail = NULL;
|
|
|
|
} else {
|
|
|
|
node->next->prev = NULL;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
node->prev->next = node->next;
|
|
|
|
if (node->next == NULL) {
|
|
|
|
list->tail = node->prev;
|
|
|
|
} else {
|
|
|
|
node->next->prev = node->prev;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
free(node);
|
|
|
|
list->size--;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2022-03-28 17:52:16 +00:00
|
|
|
int ll_remove_next(List *list, ListNode *node, void **data) {
|
2021-02-01 22:06:37 +00:00
|
|
|
if (node->next == NULL) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
return ll_remove(list, node->next, data);
|
|
|
|
}
|
|
|
|
|
2022-03-28 17:52:16 +00:00
|
|
|
int ll_remove_prev(List *list, ListNode *node, void **data) {
|
2021-02-01 22:06:37 +00:00
|
|
|
if (node->prev == NULL) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
return ll_remove(list, node->prev, data);
|
|
|
|
}
|
|
|
|
|