int main(int argc, char **argv) { void *rbtree; unsigned i = 0; int c; char buf[256]; if (parse_args(argc, argv) == -1) { usage(); exit(1); } FILE *fp = NULL; if (!infile) { fp = stdin; } else { fp = fopen(infile, "r"); if (!fp) { fprintf(stderr, "Can't open file: %s\n", infile); exit(1); } } rbtree = rbtree_new(key_cmp, free, free); while ((c = fgetc(fp)) != EOF) { if (c == '\n') { buf[i] = '\0'; rbtree_insert(rbtree, strdup(buf), strdup(buf)); memset(buf, 0, sizeof buf); i = 0; } else { buf[i++] = c; } } if (infile) fclose(fp); if (export) { fp = fopen(export, "w"); rbtree_dump(fp, rbtree, key_string); fclose(fp); } if (interactive) { void *node; while (1) { i = 0; memset(buf, 0, sizeof buf); printf("\n> "); while ((c = getc(stdin))) { if (c == EOF || c == '\n') break; if (i >= 256) { printf("buffer exceeded\n"); goto done; } buf[i++] = c; } if (c == EOF) break; if (!*buf) continue; buf[i] = '\0'; char *op = buf; while (*op && *op != ' ') op++; if (*op) { *op = '\0'; op++; } if (strncasecmp(buf, "successor", strlen("successor")) == 0) { node = rbtree_get(rbtree, op); if (node) { void *n2 = rbtree_successor(rbtree, node); if (n2) printf("successor: %s => %s\n", key_string(rbtree_node_key(n2)), (char *)rbtree_node_value(n2)); else printf("no successor\n"); } else { printf("%s (not found)\n", op); } } else if (strncasecmp(buf, "predecessor", strlen("predecessor")) == 0) { node = rbtree_get(rbtree, op); if (node) { void *n2 = rbtree_predecessor(rbtree, node); if (n2) printf("predecessor: %s => %s\n", key_string(rbtree_node_key(n2)), (char *)rbtree_node_value(n2)); else printf("no predecessor\n"); } else { printf("%s (not found)\n", op); } } else { node = rbtree_get(rbtree, buf); if (node) printf("%s => %s\n", key_string(rbtree_node_key(node)), (char *)rbtree_node_value(node)); else printf("%s (not found)\n", buf); } } } done: rbtree_free(rbtree); if (infile) free(infile); if (export) free(export); return 0; }
int main() { int i, count = 30; key_t key; RBTreeNodeHandle root = NULL; int test_addr = 0; key_t search_key = -1; key_t delete_key = -1; srand(1103515245); for (i = 1; i < count; ++i) { key = rand() % count; test_addr = key; AGILE_LOGI("key = %d", key); root = rbtree_insert(root, key, (void *)&test_addr); if (!(i % 188)){ AGILE_LOGI("[i = %d] set search key %d", i, key); search_key = key; } if (!(i % 373)){ AGILE_LOGI("[i = %d] set delete key %d", i, key); delete_key = key; } if (search_key > 0){ if (rbtree_get(root, search_key)) { AGILE_LOGI("[i = %d] search key %d success!", i, search_key); search_key = -1; } else { AGILE_LOGI("[i = %d] search key %d error!", i, search_key); return (-1); } } if (delete_key > 0) { AGILE_LOGI("****** Before delete: node number: %d, repeatKeyNum: %d", rbtree_dump(root, 0), rbtree_debug_getRepeatNum()); if (rbtree_delete(&root, delete_key) == 0) { AGILE_LOGI("[i = %d] delete key %d success (%d)", i, delete_key, ++deleteNum); delete_key = -1; } else { AGILE_LOGI("[i = %d] delete key %d error", i, delete_key); return -1; } AGILE_LOGI("****** After delete: node number: %d", rbtree_dump(root, 0)); /*return 0;*/ } /*rbtree_dump(root, 1);*/ } { RBTreeNodeHandle n; i = 0; for (n = rbtree_first(root); n; n = rbtree_next(n)) { AGILE_LOGI("index %d: key - %lld", i, n->key); i++; } } return 0; }