diff options
| author | Blake Romero <blake@blkrom.com> | 2025-10-10 17:43:54 +0100 |
|---|---|---|
| committer | Blake Romero <blake@blkrom.com> | 2025-10-10 17:43:54 +0100 |
| commit | 4e36efdf20ed9f7be0c98743b6ddfa54f472c849 (patch) | |
| tree | 9803384bb412df2c09df4eded432c30c09a64044 /src/lib/list.c | |
| parent | b188817ad2a0c26264b742fed55320260650ecb7 (diff) | |
Rename & refactor list data structure
Diffstat (limited to 'src/lib/list.c')
| -rw-r--r-- | src/lib/list.c | 119 |
1 files changed, 119 insertions, 0 deletions
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 <stdio.h> +#include <stdlib.h> +#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; +} |
