Пример #1
0
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); 
}
Пример #2
0
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;
}
Пример #3
0
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;
}