diff --git a/list_and_trees/double_linked_list.c b/list_and_trees/double_linked_list.c new file mode 100644 index 0000000..06a5360 --- /dev/null +++ b/list_and_trees/double_linked_list.c @@ -0,0 +1,198 @@ +#include +#include + +typedef int Data; +struct Node { + struct Node * next; + struct Node * prev; + Data data; +}; + + +void list_init(struct Node * list); +void list_insert(struct Node * list, struct Node * t); +void list_insert_before(struct Node * list, struct Node * t); +void list_remove(struct Node * t); +struct Node * list_push_front(struct Node * list, Data d); +struct Node * list_push_back(struct Node * list, Data d); +Data list_pop_front(struct Node * list); +Data list_pop_back(struct Node * list); +Data list_delete(struct Node * t); +void list_print (struct Node * list); +Data list_sum (struct Node * list); +int list_is_empty(struct Node * list); +int list_clear(struct Node * list); +void list_for_each(struct Node * list, void (*func)(Data d, void * param), void * param); +void print_it(Data d, void * parameter); +void sum(Data a, void * s); + +void list_init(struct Node * list) { + list->next = list; + list->prev = list; + list->data = 113; +} + +/*void list_print (struct Node * list) { + if (list != list->next) { + list_for_each(list, print_it, stdout); + printf("\n"); + } + else { + printf("Empty list\n"); + } +}*/ +void list_print (struct Node * list) { + struct Node *ptr = list->next; + if (ptr == list) { + printf("Empty list\n"); + } + else { + while (ptr->next != list) { + printf("%d ", ptr->data); + //printf("%d [%p](prev is %p, next is %p)\n", ptr->data, ptr, ptr->prev, ptr->next); + ptr = ptr->next; + } + printf("%d\n", ptr->data); + //printf("%d [%p](prev is %p, next is %p)\n", ptr->data, ptr, ptr->prev, ptr->next); + } +} + +void list_insert(struct Node * list, struct Node * t) { + t->next = list->next; + t->prev = list; + if (t->next != list) { + t->next->prev = t; + } + else { + t->next = list; + list->prev = t; + } + list->next = t; +} + +void list_insert_before(struct Node * list, struct Node * t) { + t->next = list; + t->prev = list->prev; + if (t->prev != list) { + t->prev->next = t; + } + else { + t->prev = list; + list->next = t; + } + list->prev = t; +} + +void list_remove(struct Node * t) { + t->prev->next = t->next; + t->next->prev = t->prev; +} + +struct Node * list_push_front(struct Node * list, Data d) { + struct Node *ptr = list->next; + struct Node *oth = malloc(sizeof(struct Node)); + oth->data = d; + oth->next = ptr; + oth->prev = list; + list->next = oth; + ptr->prev = oth; + return list; +} + +struct Node * list_push_back(struct Node * list, Data d) { + struct Node *ptr = list->prev; + struct Node *oth = malloc(sizeof(struct Node)); + oth->data = d; + oth->next = list; + oth->prev = ptr; + list->prev = oth; + ptr->next = oth; + return list; +} + +int list_is_empty(struct Node * list) { + if (list == list->next) { + return 1; + } + return 0; +} + +int list_clear(struct Node * list) { + struct Node *ptr = list->next; + + struct Node *next; + while (ptr->next != list) { + next = ptr->next; + free(ptr); + ptr = next; + } + list->next = list; + list->prev = list; + return 0; +} + +Data list_pop_front(struct Node * list) { + struct Node *ptr = list->next; + Data val = ptr->data; + list->next = ptr->next; + ptr->next->prev = list; + free(ptr); + + return val; +} + +Data list_pop_back(struct Node * list) { + struct Node *ptr = list->prev; + Data val = ptr->data; + list->prev = ptr->prev; + ptr->prev->next = list; + free(ptr); + + return val; +} + +Data list_delete(struct Node * t) { + t->prev->next = t->next; + t->next->prev = t->prev; + Data val = t->data; + free(t); + return val; +} + +void list_for_each(struct Node * list, void (*func)(Data d, void * param), void * param) { + struct Node *ptr = list->next; + while (ptr->next != list) { + func(ptr->data, param); + ptr = ptr->next; + } +} + +void sum(Data a, void * s) { + *(Data *)s += a; +} + +void print_it(Data d, void * param) { + FILE * fd = param; + fprintf(fd, "%d ", d); +} + +Data list_sum (struct Node * list) { + int s = 0; + list_for_each(list, sum, &s); + return s; +} + +int main() { +struct Node x[10]; + struct Node * a = malloc(sizeof(struct Node)); + struct Node * b = malloc(sizeof(struct Node)); + int i; + list_init(a); + list_init(b); + + for(i=0; i<10; i++) { + x[i].data = i; + list_insert(a, &x[i]); + } + list_print(a); +}