void insert_recommended_item(size_t index, float _value, recommended_items_t* items) { recommended_item_t* item = NULL; rb_node_t* deleted_item = NULL; if (!items) return; if (!items->filled_items_nb) items->raduis = _value; if (items->filled_items_nb < items->items_number) { items->filled_items_nb++; items->raduis = fmax(items->raduis, _value); item = malloc(sizeof(recommended_item_t)); if (item) { item->index = index; item->rating = _value; } rb_insert_value(items->items, item); } else if (_value > items->raduis) { deleted_item = rb_delete_min_element(items->items); /* Recycle deleted element */ if (deleted_item) { item = (recommended_item_t*) deleted_item->value; if (item) { item->index = index; item->rating = _value; } rb_insert(items->items, deleted_item); items->raduis = get_item_rating_from_node(rb_max_value(items->items)); } } }
int test_red_black_tree_1(void) { red_black_tree_t* tree_1 = init_red_black_tree(cmp_rb_node_value, destruct_rb_node_value, copy_rb_node_value); red_black_tree_t* tree_2 = init_red_black_tree(cmp_rb_node_value, destruct_rb_node_value, copy_rb_node_value); int i; int n; void* node = NULL; int* sorted_values = malloc(MAX_TREE_VALUES * sizeof(int)); int* values = malloc(MAX_TREE_VALUES * sizeof(int)); printf("Test red black tree ... \n"); assert(tree_1); assert(tree_2); if (!tree_1 || !tree_2) return 1; if (!values) return 1; if (!sorted_values) return 1; node = rb_max_value(tree_1); assert(node == NULL); node = rb_min_value(tree_1); assert(node == NULL); srand ( SEED_VALUE ); for (i = 0; i < MAX_TREE_VALUES; i++) { n = rand(); values[i] = n; sorted_values[i] = n; rb_insert_value(tree_1, new_rb_node_value(n)); rb_insert_value(tree_2, new_rb_node_value(n)); } qsort(sorted_values, MAX_TREE_VALUES, sizeof(int), cmp_integer); n = get_rb_node_value_from_node(rb_max_value(tree_1)); assert(n == sorted_values[MAX_TREE_VALUES - 1]); n = get_rb_node_value_from_node(rb_min_value(tree_1)); assert(n == sorted_values[0]); for (i = 0; i < MAX_TREE_VALUES - 1; i++) { rb_delete_min_element(tree_1); n = get_rb_node_value_from_node(rb_min_value(tree_1)); assert(sorted_values[i + 1] == n); n = get_rb_node_value_from_node(rb_max_value(tree_1)); assert(n == sorted_values[MAX_TREE_VALUES - 1]); } for (i = 0; i < MAX_TREE_VALUES - 1; i++) { rb_delete_max_element(tree_2); n = get_rb_node_value_from_node(rb_max_value(tree_2)); assert(sorted_values[MAX_TREE_VALUES - i - 2] == n); n = get_rb_node_value_from_node(rb_min_value(tree_2)); assert(n == sorted_values[0]); } rb_delete_tree(tree_1); rb_delete_tree(tree_2); free(values); free(sorted_values); printf("Test red black tree [OK] \n"); return 0; }
static void * find_left_max(MTrace * m){ return rb_max_value(m->rb1); }