コード例 #1
0
ファイル: rb_tree.c プロジェクト: codeplayer2org/CLRS-code
int
main(void)
{
    //int         i;
    RB_TREE     *T;

    T = tree_init();

    node_insert(T, 23);
    node_insert(T, 94);
    node_insert(T, 32);
    node_insert(T, 84);
    node_insert(T, 12);
    node_insert(T, 8);
    node_insert(T, 82);
    node_insert(T, 31);
    node_insert(T, 59);
    node_insert(T, 41);
    node_insert(T, 73);

    //for ( i = 0 ; i < 1000 ; i++ ) {
    //    key = rand() % 1000;
    //    node_insert(T, key);
    //}


    inorder_tree_walk(T, T->root);
    printf("\n");

    node_delete(T, 32);
    node_delete(T, 8);
    node_delete(T, 4);

    printf("after delete 32, 8, 4:\n");
    inorder_tree_walk(T, T->root);
    printf("\n");

    printf("sucessor of 23 is %d\n", rbtree_successor(T, rbtree_search(T, T->root, 23))->key);
    printf("predecessor of 84 is %d\n", rbtree_predecessor(T, rbtree_search(T, T->root, 84))->key);
    printf("the maximun is %d\n", rbtree_maximum(T, T->root)->key);
    printf("the minimum is %d\n", rbtree_minimum(T, T->root)->key);

    node_destory(T, T->root);
    tree_destory(T);

    exit(0);
}
コード例 #2
0
ファイル: rbtree_cli.c プロジェクト: davidreynolds/alder
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;
}