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; }
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; }
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; }