int main() {

	ARRAY_TREE myTree = array_tree_init(4);
    char myChararr[] = {'F','B','A','D','C','E','G','I','H','T','Y','Z','X'};
    int i;
    for(i = 0; i<sizeof(myChararr); i++){
        array_tree_insert(myTree, &myChararr[i]);
    }

    array_tree_preorder(myTree);
    printf("\n");
    array_tree_inorder(myTree);
    printf("\n");
    array_tree_postorder(myTree);
    printf("\n");
    char c = 'C';
    array_tree_delete(myTree, &c);
    array_tree_inorder(myTree);
    printf("\n");
    array_tree_print_horizontal(myTree);
    printf("\n");
    array_tree_balance(myTree);
    array_tree_print_horizontal(myTree);
    printf("\n");
    free(myTree);
    return 1;

}
Exemple #2
0
int
array_delrange(stk_array **harr, array_iter *start, array_iter *end)
{
    stk_array *arr;
    array_data *itm;
    int sidx, eidx, totsize;
    array_iter idx;
    array_iter didx;

    if (!harr || !*harr) {
        return -1;
    }
    arr = *harr;
    switch (arr->type) {
        case ARRAY_PACKED:{
            if (start->type != PROG_INTEGER) {
                return -1;
            }
            if (end->type != PROG_INTEGER) {
                return -1;
            }
            if (arr->items == 0) { /* nothing to do here */
                return 0;
            }

            sidx = start->data.number;
            eidx = end->data.number;
            if (sidx < 0) {
                sidx = 0;
            } else if (sidx >= arr->items) {
                return -1;
            }
            if (eidx >= arr->items) {
                eidx = arr->items - 1;
            } else if (eidx < 0) {
                return -1;
            }
            if (sidx > eidx) {
                return -1;
            }
            if (arr->links > 1 && !arr->pinned) {
                arr->links--;
                arr = *harr = array_decouple(arr);
            }
            start->data.number = sidx;
            end->data.number = eidx;
            copyinst(end, &idx);
            copyinst(start, &didx);
            idx.data.number += 1;
            while (idx.data.number < arr->items) {
                itm = array_getitem(arr, &idx);
                // plug memory leak -davin
                if (arr->data.packed[didx.data.number].type != PROG_CLEARED ) {
                    CLEAR(&arr->data.packed[didx.data.number]);
                }
                copyinst(itm, &arr->data.packed[didx.data.number]);
                CLEAR(itm);
                idx.data.number++;
                didx.data.number++;
            }
            arr->items -= (eidx - sidx + 1);
            totsize = (arr->items) ? arr->items : 1;
            arr->data.packed =
                (array_data *) realloc(arr->data.packed,
                                       sizeof(array_data) * totsize);
            return arr->items;
            break;
        }

        case ARRAY_DICTIONARY:{
            array_tree *s;
            array_tree *e;

            s = array_tree_find(arr->data.dict, start);
            if (!s) {
                s = array_tree_next_node(arr->data.dict, start);
                if (!s) {
                    return arr->items;
                }
            }
            e = array_tree_find(arr->data.dict, end);
            if (!e) {
                e = array_tree_prev_node(arr->data.dict, end);
                if (!e) {
                    return arr->items;
                }
            }
            if (array_tree_compare(&s->key, &e->key, 0, 0, 0) > 0) {
                return arr->items;
            }
            if (arr->links > 1 && !arr->pinned) {
                arr->links--;
                arr = *harr = array_decouple(arr);
            }
            copyinst(&s->key, &idx);
            while (s && array_tree_compare(&s->key, &e->key, 0, 0, 0) <= 0) {
                arr->data.dict = array_tree_delete(&s->key, arr->data.dict);
                arr->items--;
                s = array_tree_next_node(arr->data.dict, &idx);
            }
            CLEAR(&idx);
            return arr->items;
            break;
        }

        default:
            break;
    }
    return -1;
}