Exemple #1
0
array_tree *
array_tree_insert(array_tree **avl, array_iter *key)
{
    array_tree *ret;
    register array_tree *p = *avl;
    register int cmp;
    static int balancep;

    if (p) {
        cmp = AVL_COMPARE(key, AVL_KEY(p));
        if (cmp > 0) {
            ret = array_tree_insert(&(AVL_RT(p)), key);
        } else if (cmp < 0) {
            ret = array_tree_insert(&(AVL_LF(p)), key);
        } else {
            balancep = 0;
            return (p);
        }
        if (balancep) {
            *avl = array_tree_balance_node(p);
        }
        return ret;
    } else {
        p = *avl = array_tree_alloc_node(key);
        balancep = 1;
        return (p);
    }
}
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 #3
0
int
array_insertitem(stk_array **harr, array_iter *idx, array_data *item)
{
    stk_array *arr;
    int i;

    if (!harr || !*harr || !idx) {
        return -1;
    }
    arr = *harr;
    switch (arr->type) {
        case ARRAY_PACKED:{
            if (idx->type != PROG_INTEGER) {
                return -1;
            }
            if (idx->data.number < 0 || idx->data.number > arr->items) {
                return -1;
            }
            if (arr->links > 1 && !arr->pinned) {
                arr->links--;
                arr = *harr = array_decouple(arr);
            }
            arr->data.packed = (array_data *)
                realloc(arr->data.packed,
                        sizeof(array_data) * (arr->items + 1));
            for (i = arr->items++; i > idx->data.number; i--) {
                copyinst(&arr->data.packed[i - 1], &arr->data.packed[i]);
                CLEAR(&arr->data.packed[i - 1]);
            }
            copyinst(item, &arr->data.packed[i]);
            return arr->items;
            break;
        }

        case ARRAY_DICTIONARY:{
            array_tree *p;

            if (arr->links > 1 && !arr->pinned) {
                arr->links--;
                arr = *harr = array_decouple(arr);
            }
            p = array_tree_find(arr->data.dict, idx);
            if (p) {
                CLEAR(&p->data);
            } else {
                arr->items++;
                p = array_tree_insert(&arr->data.dict, idx);
            }
            copyinst(item, &p->data);
            return arr->items;
            break;
        }

        default:
            break;
    }
    return -1;
}
Exemple #4
0
int
array_setitem(stk_array **harr, array_iter *idx, array_data *item)
{
    stk_array *arr;

    if (!harr)
        return -1;
    if (!*harr)
        return -2;
    if (!idx)
        return -3;
    arr = *harr;
    switch (arr->type) {
        case ARRAY_PACKED:{
            if (idx->type != PROG_INTEGER) {
                return -4;
            }
            if (idx->data.number >= 0 && idx->data.number < arr->items) {
                if (arr->links > 1 && !arr->pinned) {
                    arr->links--;
                    arr = *harr = array_decouple(arr);
                }
                CLEAR(&arr->data.packed[idx->data.number]);
                copyinst(item, &arr->data.packed[idx->data.number]);
                return arr->items;
            } else if (idx->data.number == arr->items) {
                if (arr->links > 1 && !arr->pinned) {
                    arr->links--;
                    arr = *harr = array_decouple(arr);
                }
                arr->data.packed = (array_data *)
                    realloc(arr->data.packed,
                            sizeof(array_data) * (arr->items + 1));
                copyinst(item, &arr->data.packed[arr->items]);
                return (++arr->items);
            } else {
                return -5;
            }
            break;
        }

        case ARRAY_DICTIONARY:{
            array_tree *p;

            if (arr->links > 1) {
                arr->links--;
                arr = *harr = array_decouple(arr);
            }
            p = array_tree_find(arr->data.dict, idx);
            if (p) {
                CLEAR(&p->data);
            } else {
                arr->items++;
                p = array_tree_insert(&arr->data.dict, idx);
            }
            copyinst(item, &p->data);
            return arr->items;
            break;
        }

        default:
            break;
    }
    return -6;
}