typedef struct T{ //Main struct of the nodes
char *value; //String view like a pointer
struct T *T_l, *T_r; //Pointers left and right
}*tree, dim;
tree mergetree(char *el, tree t1, tree t2){ // Merging sub-btree
tree t0 = (tree)malloc(sizeof(dim));// Create a struct for merge the sub-btree
t0->T_l = t1;
t0->T_r = t2;
t0->value = el;
return(t0);
}
tree createleaf(char *el){ //New leaf calling the mergetree function
return mergetree(el, NULL, NULL);
}
int isvoidtree(tree t){ // Checking if the tree is void or not
return (t == NULL);
}
char *root(tree t){ //Return value of the node
return t->value;
}
tree leftchild(tree t){ // Return pointer of the node
return t->T_l;
}
tree rightchild(tree t){ // Return pointer of the node
return t->T_r;
}
tree insert(char *el, tree t){ //Insert the new element calling specific functions
if(isvoidtree(t))
return createleaf(el);
if (strcmp(root(t), el)>=0) //Left side
return mergetree(root(t), insert(el, leftchild(t)), rightchild(t));
if (strcmp(root(t),el)<0) //Right side
return mergetree(root(t), leftchild(t), insert(el, rightchild(t)));
else return t;
}
void showtree(tree t){ //Show recursively the root of all sub-btree
int i;
if (isvoidtree(t) == false){ // if the tree is not null the start of recursive calls start
showtree(leftchild(t));
printf("%s\n", root(t));
showtree(rightchild(t));
}
}
主要功能包含树状结构,变量等初始化
互动。
int main(int argc, char** argv) {
int N,i;
char el[20];
tree btree = NULL; //init btree
printf("Size:\n");
scanf("%d",&N);
for(i=0;i<N;i++){
printf("Insert name:\n");
scanf("%s",el);
btree = insert(el,btree);}
showtree(btree); //Output btree
return (EXIT_SUCCESS);
}
你好。以上是我的代码。我的串联有问题
左右的树木。输出我总是得到最后添加的节点
遍历了N倍大的树。问题似乎出在字符串中。在此先感谢大家。
最佳答案
您将每个名称读入同一数组;因此,树中的每个元素都指向相同的字符串,其中包含输入的姓氏。就像您为每个新节点分配空间一样(但是,由于无法释放不再使用的节点),您需要为每个名称分配空间。
关于c - Btree与指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32277190/