// 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("[ "); 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; }