Esempio n. 1
0
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;
}
Esempio n. 2
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;  
}