aboutsummaryrefslogtreecommitdiff
path: root/src/ll.c
diff options
context:
space:
mode:
authorBlake Romero <blake@blkrom.com>2024-09-18 00:32:53 +0100
committerBlake Romero <blake@blkrom.com>2024-10-30 10:13:26 +0000
commit45c1fbf4dfe5c7a7243b625eb8a600bdce6c748f (patch)
tree0c19f2d45941d2027ae5f07586af4bd427a5cdf6 /src/ll.c
parentd1841d4d2a087d1681d1fb483301b4a7e4722f98 (diff)
Add makefile & tests
Diffstat (limited to 'src/ll.c')
-rw-r--r--src/ll.c118
1 files changed, 118 insertions, 0 deletions
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 <stdio.h>
+#include <stdlib.h>
+#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;
+}