// Implementation of a Linked List #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; } // TODO: llfree recursive implementation // ... 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; }