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