今天想去练习一下二叉树的使用的,使用前就必须要创建一个二叉树啊。我用的是前序式的创建方法,都是通过调用子函数createtree来创建一个树(先创建根->左孩子->右孩子),是通过递归的方法的。但是当我测试的时候,每次访问树根的都会出错,原来创建的二叉树根本就没有保存在主函数的head中,我用单步调试发现malloc有问题,没有达到我想要的效果。我是知道malloc在进程结束前都不会自动free掉malloc分配的内存的,那为什么我申请的内存却没有返回到主函数中呢?
#include
#include
typedef struct _tree
{
char data;
struct _tree *lchild;
struct _tree *rchild;
}bittree;
int createtree(bittree *head)
{
char data;
fscanf(stdin,"%c",&data);
getchar();
if('#' == data)
{
//*head = NULL;
}
else
{
head = (bittree*)malloc(sizeof(bittree));
if(head == NULL) exit(0);
head->data = data;
head->lchild = NULL;
head->rchild = NULL;
createtree(head->lchild);
createtree(head->rchild);
}
return 1;
}
int main()
{
bittree *head = NULL;
createtree(head);
puts("ok!");
printf("root lchild data = %c\n",head->lchild->data);
return 1;
}
上面是错误的代码的,出错的地方是在函数调用的时候我传的是*head ,我的最大的失误就是以为传的是指针,在子函数中修改什么都能保存的。而忘记了只是修改指针指向的地址单元被修改了才会被保存,而起传递的指针本身被修改时不会被保存的,因为传的指针本身就是相当于值传参,而不是传地址。因此若要想保存在子函数中malloc中的指针就必须要使用一个指针来保存,而在子函数想保存指针当然使用的是指针的指针的(当然也可以将指针返回也是可以的)。因此该代码想要正确的话就必须传的是&head,而不是head这么简单了。正确的代码是