From 4e36efdf20ed9f7be0c98743b6ddfa54f472c849 Mon Sep 17 00:00:00 2001 From: Blake Romero Date: Fri, 10 Oct 2025 17:43:54 +0100 Subject: Rename & refactor list data structure --- src/lib/list.c | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib/list.h | 52 +++++++++++++++++++++++++ src/ll.c | 119 --------------------------------------------------------- src/ll.h | 54 -------------------------- 4 files changed, 171 insertions(+), 173 deletions(-) create mode 100644 src/lib/list.c create mode 100644 src/lib/list.h delete mode 100644 src/ll.c delete mode 100644 src/ll.h (limited to 'src') diff --git a/src/lib/list.c b/src/lib/list.c new file mode 100644 index 0000000..26c8cc1 --- /dev/null +++ b/src/lib/list.c @@ -0,0 +1,119 @@ +// Implementation of a Linked List +// +// TODO: recursive implementation for list_free() +// + +#include +#include +#include "list.h" + +Node* node_init(int value) { + Node* n = (Node*) malloc(sizeof(Node)); + n->value = value; + n->next = NULL; + return n; +} + +void list_print(Node* head) { + Node* node = head; + printf("[ "); + while (node != NULL) { + printf("%i ", node->value); + node = node->next; + } + printf("]\n"); + free(node); +} + +void list_vprint(Node* head) { + Node* node = head; + while (node != NULL) { + printf("[*] %i\n", node->value); + node = node->next; + printf(" |\n"); + } + printf("[/] %s\n", (char*) node); +} + +int list_length(Node* head) { + Node* n = head; + int i = 0; + for (; n != NULL; ++i) n = n->next; + return i; +} + +void list_push(Node** head, int value) { + Node* n = node_init(value); + n->next = *head; + *head = n; +} + +int list_pop(Node** head) { + int val = (*head)->value; + *head = (*head)->next; + return val; +} + +void list_append(Node* head, int value) { + Node* n = head; + while (n->next != NULL) n = n->next; + n->next = node_init(value); +} + +void list_insert(Node** head, int value, int index) { + Node* n = *head; + Node* cur = NULL; + Node* node = node_init(value); + int i = 0; + while (n->next != NULL && i < index) { + cur = n; + n = n->next; + ++i; + } + cur->next = node; + node->next = n; +} + +void list_free(Node** head) { + while (*head != NULL) { + Node* n = *head; + *head = (*head)->next; + free(n); + } + *head = NULL; +} + +int list_rmlast(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 list_rm(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; +} diff --git a/src/lib/list.h b/src/lib/list.h new file mode 100644 index 0000000..58a7751 --- /dev/null +++ b/src/lib/list.h @@ -0,0 +1,52 @@ +#ifndef LIST_H +#define LIST_H + +#include +#include + +// Node +typedef struct Node { + int value; + struct Node* next; +} Node; + +// Create & initialise a new node +Node* node_init(int value); + +// Print linked list values +void list_print(Node* head); +void list_vprint(Node* head); + +// Return number of nodes in list +// O(n) +int list_length(Node* head); + +// Prepend a value to the list +// O(1) +void list_push(Node** head, int value); + +// Pop (remove) first node +// O(1) +int list_pop(Node** head); + +// Append value to the end of the list +// O(n) +void list_append(Node* head, int value); + +// Insert a value to the list at index +// O(n) +void list_insert(Node** head, int value, int index); + +// Free nodes from memory +// O(n) +void list_free(Node** head); + +// Remove last node +// O(n) +int list_rmlast(Node** head); + +// Remove node at index +// O(n) +int list_rm(Node** head, int index); + +#endif //LIST_H diff --git a/src/ll.c b/src/ll.c deleted file mode 100644 index ef5e021..0000000 --- a/src/ll.c +++ /dev/null @@ -1,119 +0,0 @@ -// Implementation of a Linked List -// -// TODO: recursive implementation for llfree -// - -#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("[ "); - while (node != NULL) { - printf("%i ", node->value); - node = node->next; - } - printf("]\n"); - free(node); -} - -void llvprint(Node* head) { - Node* node = head; - while (node != NULL) { - printf("[*] %i\n", node->value); - node = node->next; - printf(" |\n"); - } - printf("[/] %s\n", (char*) node); -} - -int lllength(Node* head) { - Node* n = head; - int i = 0; - for (; n != NULL; ++i) n = n->next; - return i; -} - -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) { - while (*head != NULL) { - Node* n = *head; - *head = (*head)->next; - free(n); - } - *head = NULL; -} - -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; -} diff --git a/src/ll.h b/src/ll.h deleted file mode 100644 index 9286dfd..0000000 --- a/src/ll.h +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef LL_H -#define LL_H - -#define NEW_NODE llnode(); - -#include -#include - -// Node -typedef struct Node { - int value; - struct Node* next; -} Node; - -// Create & initialise a new node -Node* llnode(int value); - -// Print linked list values -void llprint(Node* head); -void llvprint(Node* head); - -// Return number of nodes in list -// O(n) -int lllength(Node* head); - -// Prepend a value to the list -// O(1) -void llpush(Node** head, int value); - -// Pop (remove) first node -// O(1) -int llpop(Node** head); - -// Append value to the end of the list -// O(n) -void llappend(Node* head, int value); - -// Insert a value to the list at index -// O(n) -void llinsert(Node** head, int value, int index); - -// Free nodes from memory -// O(n) -void llfree(Node** head); - -// Remove last node -// O(n) -int llrmlast(Node** head); - -// Remove node at index -// O(n) -int llrm(Node** head, int index); - -#endif //LL_H -- cgit