// Implementation of a Linked List // // TODO: recursive implementation for list_free() // #include #include #include "list.h" Node* node_init(int value) { Node* n = (Node*) malloc(sizeof(Node)); n->value = value; n->next = NULL; return n; } void list_print(Node* head) { Node* node = head; printf("[ "); while (node != NULL) { printf("%i ", node->value); node = node->next; } printf("]\n"); free(node); } void list_vprint(Node* head) { Node* node = head; while (node != NULL) { printf("[*] %i\n", node->value); node = node->next; printf(" |\n"); } printf("[/] %s\n", (char*) node); } int list_length(Node* head) { Node* n = head; int i = 0; for (; n != NULL; ++i) n = n->next; return i; } void list_push(Node** head, int value) { Node* n = node_init(value); n->next = *head; *head = n; } int list_pop(Node** head) { int val = (*head)->value; *head = (*head)->next; return val; } void list_append(Node* head, int value) { Node* n = head; while (n->next != NULL) n = n->next; n->next = node_init(value); } void list_insert(Node** head, int value, int index) { Node* n = *head; Node* cur = NULL; Node* node = node_init(value); int i = 0; while (n->next != NULL && i < index) { cur = n; n = n->next; ++i; } cur->next = node; node->next = n; } void list_free(Node** head) { while (*head != NULL) { Node* n = *head; *head = (*head)->next; free(n); } *head = NULL; } int list_rmlast(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 list_rm(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; }