Esempio n. 1
0
int main ( int argc, char * argv[]) {
	unsigned int seed,nelt,keylen;
	if ( argc!=4){
		printf ("Usage: rbtree seed nelt keylen\n");
		return EXIT_FAILURE;
	}
	sscanf(argv[1],"%u",&seed); srandom(seed);
	sscanf(argv[2],"%u",&nelt);
	sscanf(argv[3],"%u",&keylen);

	RBTREE tree = create_rbtree(lexo,strcopykey,strfreekey);
	char ** keys = random_keys(nelt,keylen);
	printf ("Inserting elements\n");
	for ( int i=0 ; i<nelt ; i++){
		printf ("\tinserting %s\n",keys[i]);
		insertelt_rbtree(tree,keys[i],"a");
		check_rbtree(tree);
	}
	unsigned int ntree_elt = nmemb_rbtree(tree);
	printf ("Tree contains %u elements in total\n",ntree_elt);
	assert(ntree_elt<=nelt);


	printf ("Copying tree\n");
	RBTREE tree2 = copy_rbtree(tree,strcopykey);
	check_rbtree(tree2);
	printf("Freeing copied tree\n");
	free_rbtree(tree2,free);

	printf("Printing tree\n");
	unsafemap_rbtree (tree,print_node);

	printf("Iterating through tree\n");
	unsigned int iter_count = 0;
	for ( RBITER iter = iter_rbtree(tree) ; next_rbtree(iter) ; ){
		const char * key = (const char *) iterkey_rbtree(iter);
		printf("\tfound %s\n",key);
		iter_count++;
	}
	assert(iter_count==ntree_elt);  

	printf ("Removing elements\n");
	unsigned int * rperm = random_permutation(nelt);
	fputs("Permutation: ",stdout);
	print_rperm(rperm,nelt);
	for ( int i=0 ; i<nelt ; i++){
		printf("\tremoving %s\n",keys[rperm[i]]);
		removeelt_rbtree(tree,keys[rperm[i]]);
		check_rbtree(tree);
	}
	assert(nmemb_rbtree(tree)==0);
	free_rbtree(tree,free);
}
Esempio n. 2
0
void FreeTree (TREE * tree)
{

  CheckIsTree (tree);

  FreeNode (tree->tree, NULL);
  Free (&tree->tstring);
  Free (&tree->branches);
  free_rbtree(tree->leaves,free);
  Free (&tree);
}
Esempio n. 3
0
//---------------rbtree debug------------------------------------//
int
rbtree_test(void)
{
    int i, j, len, slice, ret;
    struct timeval tv;
    struct rbnode node, *pn = NULL;
    struct ttlnode *tn = NULL;
    struct rbtree *rbt = NULL;
    rbt = create_rbtree(rbt_comp_ttl_gt, NULL);
    if (rbt == NULL)
        dns_error(0, "create rbtree");
    node = rbt->nil;            //nil
    slice = 8000000;
    //for(i = 0;i < n;i ++)
    //{
    for (j = 0; j < slice; j++) {
        len = random() % 30;
        tn = malloc(sizeof(struct ttlnode) + len);
        if (tn == NULL)
            printf("oom\n");
        tn->exp = j;
        for (i = 0; i < len; i++)
            tn->data[i] = 'a' + i;
        node.key = tn;
        ret = insert_node(rbt, &node);
        if (ret != 0)
            printf("insert error\n");
    }
    printf("insert all\n");
    sleep(2);
    for (j = 0; j < slice; j++) {
        pn = min_node(rbt);
        if (pn != NULL) {
            tn = delete_node(rbt, pn);
            free(tn);
        } else
            printf("error\n");
    }
    printf("delete all\n");
    sleep(5);
    //}
    if (free_rbtree(rbt) != 0)
        dns_error(0, "free");
    //get_time_usage(&tv,0);
    return 0;
}
Esempio n. 4
0
void main()
{

	rb_root = (rb_node *)malloc(sizeof(rb_node));
	double start,finish;
	result = fopen("result.txt","w");
	
	
	rb_tree *TREE;
	FILE *fp;

   unsigned int list[100000];
	int j=0;
	if (!(fp=fopen("read.txt","r")))
	{
		printf("Cannot open the file. \n");
		return;
	}
    while (j<100000)
	{
		fscanf(fp,"%u",&list[j]);
		j++;
	}
	fclose(fp);



	TREE = rb_tree_init(list,100000);
	int height;
	height = getHeight(TREE);
	printf("The height of the tree is %d\n",height);
	fprintf(result,"The height of the tree is: %d\n",height);
	printf("The rbtree is : \n");
	fprintf(result,"The initial tree is:\n");
	rbtree_output(TREE);
	int size1=getSize(TREE);
	fprintf(result,"The size of the initial tree is: %d \n",size1);
    //select the node according to the rank
	rb_tree *select_node;
	fprintf(result,"EXPERIMENT1: OS_select Operation\n");
	int r;
	for (int k=0; k<10; k++)
	{
	    printf("Please input the rank of the element to find the data:\n");
	    scanf("%d", &r);
	    select_node=OS_select(TREE,r);
        fprintf(result,"The element of rank %d is: %u\n",r,select_node->data);
	}
	
	//search
	fprintf(result,"EXPERIMENT2: Search Operation\n");
	rb_tree* search_node;
	fprintf(result,"We try to find the first ten elements in the input file\n");
	for (int k=0; k<10; k++)
	{
		search_node=rbtree_search(TREE,list[k]);
		if(search_node != rb_root)
			fprintf(result,"The %dth element is FOUND!\n",k+1);
	}
    //rank
	fprintf(result,"EXPERIMENT3: Find the rank of the element\n");
	int rank,rank_p;
	for(int k=0; k<10; k++)
	{
		fprintf(result,"We try to find the rank of the %dth element of the input file: \n",k);
		rank=os_key_rank(TREE,list[k]);
		fprintf(result,"The rank of the %dth element is: %d\n",k,rank);
	}
	
	unsigned int insert_list[100];
	unsigned int del_list[100];
	if (!(fp=fopen("insert.txt","r")))
	{
		printf("Cannot open the file. \n");
		return;
	}
	j=0;
	while(j<100)
	{
		fscanf(fp, "%u", &insert_list[j]);
		j++;
	}
	fclose(fp);
	if (!(fp=fopen("remove.txt","r")))
	{
		printf("Cannot open the file. \n");
		return;
	}
	j=0;
	while(j<100)
	{
		fscanf(fp, "%u", &del_list[j]);
		j++;
	}
	
	fclose(fp);
	//insert
	fprintf(result,"EXPERIMENT4:Insert Operation\n");
	for (j=0; j<100; j++)
	{
		rb_node *insert_node=(rb_node *)malloc(sizeof(rb_node));
		insert_node->data=insert_list[j];
		insert_node->left=rb_root;
		insert_node->right=rb_root;
		insert_node->color='W';
		int flag=rb_tree_insert(TREE,insert_node);
		if (flag == 0)
		{
               rb_tree_fixup(TREE,insert_node);
			   fprintf(result,"The insertion of %dth element has successed!\n",j);
			   height = getHeight(TREE);
			   fprintf(result,"After insertion of %dth element the height of the tree is: %d\n",j,height);
		}
		else
			fprintf(result,"The insertion of %dth element has failed!\n",j);
		
	}
	int size2=getSize(TREE);
	fprintf(result,"The size of the tree after insertion is: %d\n",size2);
	
	//remove
	fprintf(result,"EXPERIMENT5:Deletion Operation\n");
	for(j=0; j<100; j++)
	{
		int flag_del=rb_tree_delete(TREE,del_list[j]);
		if (flag_del == 0)
		{
			fprintf(result,"The deletion of %dth element has successed!\n",j);
			height = getHeight(TREE);
			fprintf(result,"After deletion of %dth element the height of the tree is: %d\n",j,height);
		}
		else
			fprintf(result,"The deletion of %dth element has failed!\n",j);
	}
	int size3=getSize(TREE);
    fprintf(result,"The size of the tree after deletion is: %d\n",size3);
	fprintf(result,"Successful! \n");
	



free_rbtree (TREE);


}