static void remove_node(struct avl_node **parent, avl_type type, struct addr_mapping *addr) { assert(parent != NULL && *parent != NULL); struct avl_node *node = *parent; struct avl_node *successor; addr_t in_value; addr_t key; in_value = type == P_TO_V ? node->mapping->paddr : node->mapping->vaddr; key = type == P_TO_V ? addr->paddr : addr->vaddr; if ( key == in_value ) { // No Child Case if (node->left == NULL && node->right == NULL) { *parent = NULL; free(node); } // Single Child Cases else if (node->left != NULL && node->right == NULL) { *parent = node->left; free(node); } else if (node->left == NULL && node->right != NULL) { *parent = node->right; free(node); } // Two Children Case else { successor = find_min_node(node->right, type, key); node->mapping->paddr = successor->mapping->paddr; node->mapping->vaddr = successor->mapping->vaddr; remove_node(&(node->right), type, successor->mapping); } // de-allocates and purged from memory return; } if ( key > in_value ) { remove_node(&(node->right), type, addr); avl_update_height(node); avl_balance_node(parent); } else if ( key < in_value ) { remove_node(&(node->left), type, addr); avl_update_height(node); avl_balance_node(parent); } else { printf("Error. Wrongful Traversal. Remove Node Fail\n"); } assert(parent != NULL); }
void queue_sort(Queue *queue, int (*compare)(const void *, const void *)) { struct node *n; Queue tmp; queue_init(&tmp); while(! queue_is_empty(queue)) { n = find_min_node(queue, compare); queue_delete_node(queue, n); queue_insert_node(&tmp, n); } queue->head = tmp.head; queue->tail = tmp.tail; }
int C_try_binary_search_tree::remove_node(Tree_node** tr, int& data) { Tree_node* node = *tr; Tree_node* parent = *tr; int parent_lr_next_flag = 0; //root:0,left:1,right:2 bool find_flag = false; while (node) { if (node->data < data) { parent = node; parent_lr_next_flag = 2; node = node->right; //fprintf(stderr, "find data right.\n"); } else if (node->data > data) { parent = node; parent_lr_next_flag = 1; node = node->left; //fprintf(stderr, "find data left.\n"); } else if (node->data == data) { find_flag = true; //fprintf(stderr, "find data equal.\n"); break; } } if (find_flag == false) { fprintf(stderr, "can not find data:( %d ) in this tree.\n", data); return -1; } else { if ((node)->left == 0 && (node)->right == 0) { //fprintf(stderr, "find line:%d\n",__LINE__); free(node); if (node == root) root = 0; else if (parent_lr_next_flag == 1) { parent->left = 0; } else if (parent_lr_next_flag == 2) { parent->right = 0; } else if(parent_lr_next_flag == 0) { *tr = 0; } } else if ((node)->left != 0 && (node)->right == 0) { //fprintf(stderr, "find line:%d\n",__LINE__); if (node == root) root = 0; else if (parent_lr_next_flag == 1) { parent->left = node->left; } else if (parent_lr_next_flag == 2) { parent->right = node->left; } else if(parent_lr_next_flag ==0) { *tr = node->left; } free(node); } else if ((node)->left == 0 && (node)->right != 0) { //fprintf(stderr, "find line:%d\n",__LINE__); if (node == root) root = node->right; else if (parent_lr_next_flag == 1) parent->left = node->right; else if (parent_lr_next_flag == 2) parent->right = node->right; else if (parent_lr_next_flag == 0) *tr = node->right; free(node); } else if ((node)->left != 0 && (node)->right != 0) { //fprintf(stderr, "find line:%d\n",__LINE__); int mindata = find_min_node((node)->right); //fprintf(stderr, "find line:%d\n",__LINE__); node->data = mindata; //fprintf(stderr, "find mindata:%d\n",mindata); remove_node(&(node)->right, mindata); } } return 0; }