#include #include struct dll_node { int data; struct dll_node *prev, *next; }; struct dll_node *create_list(int data) { struct dll_node *new_node = (struct dll_node *) malloc(sizeof(struct dll_node)); if (NULL != new_node) { new_node->data = data; new_node->prev = new_node->next = new_node; } return new_node; } struct dll_node *find_max_node(struct dll_node *node) { struct dll_node *start = node, *result = node; int maximum = node->data; do { if (maximum < node->data) { maximum = node->data; result = node; } node = node->next; } while (node != start); return result; }; struct dll_node *find_next_node(struct dll_node *node, int data) { node = find_max_node(node); struct dll_node *start = node; do { if (node->data < data) break; node = node->next; } while (node != start); return node; }; void insert_node(struct dll_node *node, int data) { if (NULL == node) return; struct dll_node *new_node = (struct dll_node *) malloc(sizeof(struct dll_node)); if (NULL != new_node) { new_node->data = data; node = find_next_node(node, data); new_node->next = node; new_node->prev = node->prev; node->prev->next = new_node; node->prev = new_node; } } struct dll_node *delete_node(struct dll_node *node, int data) { if (NULL == node) return NULL; node = find_next_node(node, data); node = node->prev; if (node->data == data) { if (node == node->next) { free(node); return NULL; } else { struct dll_node *next = node->next; node->prev->next = node->next; node->next->prev = node->prev; free(node); node = next; } } return node; } void print_list(struct dll_node *node) { if (NULL == node) return; node = find_max_node(node); struct dll_node *start = node; do { printf("%d ", node->data); node = node->next; } while (node != start); printf("\n"); } void remove_list(struct dll_node **node) { if (NULL == *node) return; struct dll_node *start = *node; do { struct dll_node *next = (*node)->next; free(*node); *node = next; } while (*node != start); *node = NULL; } void usun_rek(struct dll_node **ptr,struct dll_node *poczatek) { if (*ptr) { if((*ptr)->next!=poczatek) usun_rek(&((*ptr)->next),poczatek); *ptr = delete_node(*ptr,(*ptr)->data); } } int main() { struct dll_node *dlcl = create_list(1); int i; for (i=2; i<5; i++) insert_node(dlcl, i); for (i=6; i<10; i++) insert_node(dlcl, i); printf("List elements:\n"); print_list(dlcl); insert_node(dlcl, 0); printf("List elements after insertion of 0:\n"); print_list(dlcl); insert_node(dlcl, 5); printf("List elements after insertion of 5:\n"); print_list(dlcl); insert_node(dlcl, 7); printf("List elements after insertion of 7:\n"); print_list(dlcl); insert_node(dlcl, 10); printf("List elements after insertion of 10:\n"); print_list(dlcl); dlcl = delete_node(dlcl, 0); printf("List elements after deletion of 0:\n"); print_list(dlcl); dlcl = delete_node(dlcl, 1); printf("List elements after deletion of 1:\n"); print_list(dlcl); dlcl = delete_node(dlcl, 1); printf("List elements after deletion of 1:\n"); print_list(dlcl); dlcl = delete_node(dlcl, 5); printf("List elements after deletion of 5:\n"); print_list(dlcl); dlcl = delete_node(dlcl, 7); printf("List elements after deletion of 7:\n"); print_list(dlcl); dlcl = delete_node(dlcl, 10); printf("List elements after deletion of 10:\n"); print_list(dlcl); usun_rek(&dlcl,dlcl); puts("aaa"); print_list(dlcl); remove_list(&dlcl); return 0; }