关于二叉树的建立问题
//问题代码:#include <stdio.h>
#include<stdlib.h>
typedef char ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
//创建二叉树,按照前序遍历的方法输入
void createBiTree(BiTree T)
{
char c;
scanf("%c", &c);
if('#' == c)
{
T = NULL;
}
else
{
T = (BiTNode *)malloc(sizeof(BiTNode));
T->data = c;
createBiTree(T->lchild);
createBiTree(T->rchild);
}
}
//递归遍历
void Travel(BiTree T)
{
if(T)
{
printf("%c\n",T->data);
Travel(T->lchild);
Travel(T->rchild);
}
}
int main()
{
BiTree T=NULL;
createBiTree(T);
Travel(T);
return 0;
}
请问一下,为什么当运行到Travel(T)的时候,显示T还是为空呢?
而当按照下面的方法来做,就是对的,,,请问一下区别在哪里?谢谢
//正确代码
#include <stdio.h>
#include<stdlib.h>
typedef char ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
//按前序遍历方法创建二叉树
BiTree createBiTree()
{
BiTree T;
char c;
scanf("%c", &c);
if('#' == c)
{
T = NULL;
}
else
{
T = (BiTNode *)malloc(sizeof(BiTNode));
T->data = c;
T->lchild = createBiTree();
T->rchild = createBiTree();
}
return T;
}
//递归遍历
void Travel(BiTree T)
{
if(T)
{
printf("%c\n", T->data);
Travel(T->lchild);
Travel(T->rchild);
}
}
int main()
{
BiTree T;
T = createBiTree();
Travel(T);
return 0;
} BiTree T=NULL;&T地址存放T
createBiTree(T);传入的是T的值
在函数里存放传进的T是在函数里的栈段中,修改此地址存放的值不会影响原本&T地址存放的值,函数返回后&T还是存放NULL fc1735 发表于 2017-3-6 08:40
BiTree T=NULL;&T地址存放T
createBiTree(T);传入的是T的值
在函数里存放传进的T是在函数里的栈段中,修 ...
那再请问一下,什么时候会改变原来T的值呢?
我一直以为只要参数是个指针型就会改变原来实参的值,可按照这一题,好像又不是这样?
麻烦您了,谢谢 本帖最后由 fc1735 于 2017-3-6 18:18 编辑
云从 发表于 2017-3-6 15:43
那再请问一下,什么时候会改变原来T的值呢?
我一直以为只要参数是个指针型就会改变原来实参的值,可 ...
void createBiTree(BiTree *T)
{
char c;
scanf("%c", &c);
if('#' == c)
{
*T = NULL;
}
else
{
*T = (BiTNode *)malloc(sizeof(BiTNode));
(*T)->data = c;
createBiTree(&T->lchild);
createBiTree(&T->rchild);
}
} fc1735 发表于 2017-3-6 18:16
谢谢
页:
[1]