From 45c1fbf4dfe5c7a7243b625eb8a600bdce6c748f Mon Sep 17 00:00:00 2001 From: Blake Romero Date: Wed, 18 Sep 2024 00:32:53 +0100 Subject: Add makefile & tests --- src/ll.c | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 src/ll.c (limited to 'src/ll.c') diff --git a/src/ll.c b/src/ll.c new file mode 100644 index 0000000..7059ec5 --- /dev/null +++ b/src/ll.c @@ -0,0 +1,118 @@ +// Implementation of a Linked List +#include +#include +#include "ll.h" + +Node* llnode(int value) { + Node* n = (Node*) malloc(sizeof(Node)); + n->value = value; + n->next = NULL; + return n; +} + +void llprint(Node* head) { + Node* node = head; + printf("[ "); + do { + printf("%i ", node->value); + node = node->next; + } while (node != NULL); + printf("]\n"); + free(node); +} + +void llvprint(Node* head) { + Node* node = head; + do { + printf("[*] %i\n", node->value); + node = node->next; + printf(" |\n"); + } while (node != NULL); + printf("[/] %s\n", (char*) node); +} + +int lllength(Node* head) { + Node* node = head; + int count = 0; + while (node != NULL) { + ++count; + node = node->next; + } + return count; +} + +void llpush(Node** head, int value) { + Node* n = llnode(value); + n->next = *head; + *head = n; +} + +int llpop(Node** head) { + int val = (*head)->value; + *head = (*head)->next; + return val; +} + +void llappend(Node* head, int value) { + Node* n = head; + while (n->next != NULL) n = n->next; + n->next = llnode(value); +} + +void llinsert(Node** head, int value, int index) { + Node* n = *head; + Node* cur = NULL; + Node* node = llnode(value); + int i = 0; + while (n->next != NULL && i < index) { + cur = n; + n = n->next; + ++i; + } + cur->next = node; + node->next = n; +} + +void llfree(Node* head) { + Node* n = NULL; + while (head != NULL) { + n = head; + head = head->next; + free(n); + } +} + +int llrmlast(Node** head) { + Node* n = *head; + Node* cur = NULL; + while (n->next != NULL) { + cur = n; + n = n->next; + } + int val = n->value; + cur->next = NULL; + free(n); + return val; +} + +int llrm(Node** head, int index) { + Node* n = *head; + Node* cur = NULL; + if (index == -1) { + while (n->next != NULL) { + cur = n; + n = n->next; + } + } else { + int i = 0; + while (n->next != NULL && i < index) { + cur = n; + n = n->next; + ++i; + } + } + cur->next = n->next; + int val = n->value; + free(n); + return val; +} -- cgit