aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBlake Romero <blake@blkrom.com>2024-09-02 01:20:18 +0100
committerBlake Romero <blake@blkrom.com>2024-10-30 10:13:26 +0000
commit6469b2c887716a5c6a0e191c5ffeb7972f7f7b34 (patch)
tree9006291004faec2ce91094754fc7992a129caebf
parent3773eb12e3a613cbde4890be0c1d2a9b548abf63 (diff)
Add initial linked list implementation
-rw-r--r--linkedlist/ll.c120
-rw-r--r--linkedlist/ll.h54
-rw-r--r--linkedlist/main.c44
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);
+}