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));
}
}
main函数包含树结构,变量等初始化 相互作用。
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次树有多大。问题似乎在字符串中。先谢谢你们。
答案 0 :(得分:0)
您将每个名称读入同一个数组;因此,树的每个元素都指向相同的字符串,该字符串包含输入的姓氏。正如您为每个新节点分配空间(但无法释放您不再使用的空间,唉),您需要为每个名称分配空间。