// 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) { if (head == NULL) { puts("list is NULL"); return; } Node* node = head; printf("[ "); while (node != NULL) { printf("%i ", node->value); node = node->next; } printf("]\n"); } 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_get(Node* n, int index) { Node* m = n; if (index > list_length(n)-1) return -1; for (int i=0; inext; return m->value; } void list_set(Node* n, int index, int value) { if (index > list_length(n)) { puts("Error: Setting list out of bounds"); return; } Node *m = n; for (int i=0; inext; m->value = value; } 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; n->value=0; *head = (*head)->next; free(n); } *head = NULL; } 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; }