aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMikkel Thestrup <mikkel_thestrup@mithe.dk>2025-11-29 22:30:36 +0100
committerMikkel Thestrup <mikkel_thestrup@mithe.dk>2025-11-29 22:30:36 +0100
commit1cb55ed57b867d07994552e90b157d64d35a1376 (patch)
tree0481badc12119e11f3fed5569546cc57e33d3279 /src
parent892b47ea8b73882d98de0a7fddb358a9ddafdf9e (diff)
downloadcycle-detector-1cb55ed57b867d07994552e90b157d64d35a1376.tar.gz
cycle-detector-1cb55ed57b867d07994552e90b157d64d35a1376.zip
Added implementation for a double linked list
Diffstat (limited to 'src')
-rw-r--r--src/LinkedList.c86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/LinkedList.c b/src/LinkedList.c
new file mode 100644
index 0000000..57ac2d8
--- /dev/null
+++ b/src/LinkedList.c
@@ -0,0 +1,86 @@
+#include "LinkedList.h"
+#include <stdlib.h>
+
+LinkedList *Linkedlist_new(void) {
+ LinkedList *ll = malloc(sizeof(LinkedList));
+ if (!ll) return NULL;
+
+ ll->head = NULL;
+ ll->tail = NULL;
+ ll->size = 0;
+
+ return ll;
+}
+
+void LinkedList_delete(LinkedList *ll) {
+ LinkedListNode *node = ll->head;
+ LinkedListNode *next;
+
+ while (node) {
+ next = node->next;
+ free(node);
+ node = next;
+ }
+
+ free(ll);
+}
+
+LinkedListNode *LinkedList_append(LinkedList *ll, void *elem) {
+ LinkedListNode *new_node = malloc(sizeof(LinkedListNode));
+ if (!new_node) return NULL;
+
+ new_node->data = elem;
+ new_node->next = NULL;
+ if (!ll->head) {
+ new_node->prev = NULL;
+ ll->head = new_node;
+ ll->tail = new_node;
+ } else {
+ ll->tail->next = new_node;
+ new_node->prev = ll->tail;
+ ll->tail = new_node;
+ }
+
+ ll->size++;
+ return new_node;
+}
+
+void *LinkedList_popFront(LinkedList *ll) {
+ if (!ll->head) return NULL;
+
+ void *elem = ll->head->data;
+ LinkedListNode *node = ll->head;
+ ll->head = ll->head->next;
+
+ ll->size--;
+ free(node);
+ return elem;
+}
+
+LinkedListNode *LinkedList_find(LinkedList *ll, void *elem) {
+ if (!ll->head) return NULL;
+
+ LinkedListNode *node = ll->head;
+ while (node) {
+ /* !NOTE should use a given comparator function
+ * instead of '==' operator */
+ if (node->data == elem) return node;
+ node = node->next;
+ }
+
+ return NULL; // Couldn't find the element
+}
+
+void *LinkedList_remove(LinkedList *ll, LinkedListNode *node) {
+ void *elem = node->data;
+
+ if (node->prev) node->prev->next = node->next;
+ else ll->head = node->next;
+
+ if (node->next) node->next->prev = node->prev;
+ else ll->tail = node->prev;
+
+ free(node);
+ ll->size--;
+ return elem;
+}