diff options
| author | Blake Romero <blake@blkrom.com> | 2024-09-02 01:20:18 +0100 |
|---|---|---|
| committer | Blake Romero <blake@blkrom.com> | 2024-10-30 10:13:26 +0000 |
| commit | 6469b2c887716a5c6a0e191c5ffeb7972f7f7b34 (patch) | |
| tree | 9006291004faec2ce91094754fc7992a129caebf | |
| parent | 3773eb12e3a613cbde4890be0c1d2a9b548abf63 (diff) | |
Add initial linked list implementation
| -rw-r--r-- | linkedlist/ll.c | 120 | ||||
| -rw-r--r-- | linkedlist/ll.h | 54 | ||||
| -rw-r--r-- | linkedlist/main.c | 44 |
3 files changed, 218 insertions, 0 deletions
diff --git a/linkedlist/ll.c b/linkedlist/ll.c new file mode 100644 index 0000000..43bfa27 --- /dev/null +++ b/linkedlist/ll.c @@ -0,0 +1,120 @@ +// Implementation of a Linked List +#include <stdio.h> +#include <stdlib.h> +#include "ll.h" + +Node* llnode() { + Node* n = (Node*) malloc(sizeof(Node)); + n->value = 0; + 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"); +} + +void llvprint(Node* head) { + Node* node = head; + do { + printf("[*] %i\n", node->value); + node = node->next; + printf(" |\n"); + } while (node != NULL); + printf("[/] %p\n", node); +} + +int llcount(Node* head) { + Node* node = head; + int count = 0; + while (node != NULL) { + count++; + node = node->next; + } + return count; +} + +void llappend(Node* head, int value) { + Node* n = head; + while (n->next != NULL) n = n->next; + n->next = NEW_NODE; + n->next->value = value; + n->next->next = NULL; +} + +void llpush(Node** head, int value) { + Node* n = NEW_NODE; + n->value = value; + n->next = *head; + *head = n; +} + +void llinsert(Node** head, int value, int index) { + Node* n = *head; + Node* cur = NULL; + Node* node = NEW_NODE; + int i = 0; + node->value = value; + 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 llpop(Node** head) { + Node* n = *head; + int val = n->value; + *head = n->next; + free(n); + return val; +} + +int llrmlast(Node** head) { + Node* n = *head; + Node* cur = NEW_NODE; + 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 = NEW_NODE; + Node* node = NEW_NODE; + int i = 0; + int val = 0; + while (n->next != NULL && i < index) { + cur = n; + n = n->next; + ++i; + } + cur->next = n->next; + node->next = n; + val = n->value; + free(n); + return val; +} + diff --git a/linkedlist/ll.h b/linkedlist/ll.h new file mode 100644 index 0000000..0e15c43 --- /dev/null +++ b/linkedlist/ll.h @@ -0,0 +1,54 @@ +#ifndef LL +#define LL + +#define NEW_NODE llnode(); + +#include <stdio.h> +#include <stdlib.h> + +// Node +typedef struct Node { + int value; + struct Node* next; +} Node; + +// Create & initialise a new node +Node* llnode(); + +// Print linked list values +// O() +void llprint(Node* head); +void llvprint(Node* head); + +// Return number of nodes in list +// O(n) +int llcount(Node* head); + +// Append value to the end of the list +// O(n) +void llappend(Node* head, int value); + +// Prepend a value to the list +// O(1) +void llpush(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 +void llfree(Node* head); + +// Pop (remove) first node +// O(1) +int llpop(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 diff --git a/linkedlist/main.c b/linkedlist/main.c new file mode 100644 index 0000000..3ba95a3 --- /dev/null +++ b/linkedlist/main.c @@ -0,0 +1,44 @@ +#include "ll.h" + +int main() { + Node* head = NEW_NODE; + int val; + + val = 7; + head->value = val; + printf("Init with %i:\t", val); + llprint(head); + + val = 12; + llpush(&head, val); + printf("Push %i:\t", val); + llprint(head); + + val = 99; + printf("Append %i:\t", val); + llappend(head,val); + llprint(head); + + val = 45; + printf("Insert %i:\t", val); + llinsert(&head, val, 2); + llprint(head); + + val = 42; + printf("Insert %i:\t", val); + llinsert(&head, val, 1); + llprint(head); + + printf("Pop %i:\t\t", llpop(&head)); + llprint(head); + + printf("Remove %i:\t",llrmlast(&head)); + llprint(head); + + printf("Remove %i:\t",llrm(&head,1)); + llprint(head); + + llvprint(head); + + llfree(head); +} |
