主函数:
typedef struct BiTNode
{
int data;
struct BiTNode *Lchild, *Rchild;
} BiTNode, *BiTree;
int main(void)
{
BiTree T; //构造二叉树
InitTree(T, 3); //初始化左子树
PreOrder(T); //先序遍历
system("pause");
return 0;
}
调用函数:
void InitTree(BiTree B, int i)
{
B = (BiTree)malloc(sizeof(BiTNode)); //初始化根结点
B->data = 2;
BiTree S = B;
while (i-- > 0)
{
S->Lchild = (BiTree)malloc(sizeof(BiTNode));
S->Lchild->data = i;
S = S->Lchild;
}
S->Lchild = NULL;
}
void PreOrder(BiTree T)
{
if (T != NULL)
{
visit(T);
PreOrder(T->Lchild);
PreOrder(T->Rchild);
}
}
void visit(BiTree T)
{
printf("%d ", T->data);
}
当函数执行至visit()时,将抛出异常。
原因:未使用const修饰函数参数是问题的关键所在;在函数InitBiTree()中,函数参数B为指针变量,与主函数T指向同一地址,在将根节点(B)初始化后,实际上是改变了形参B所指向的地址,再次调用visit时,依然传入的是T的地址,导致了异常。
解决办法:
- 将InitBiTree()中B的地址回传
BiTree InitTree(BiTree B, int i) { B = (BiTree)malloc(sizeof(BiTNode)); //初始化根结点 B->data = 2; BiTree S = B; while (i-- > 0) { S->Lchild = (BiTree)malloc(sizeof(BiTNode)); S->Lchild->data = i; S = S->Lchild; } S->Lchild = NULL; return B; } - 在主函数中初始化根结点
int main(void) { BiTree T; //构造二叉树 T = (BiTree)malloc(sizeof(BiTNode)); InitTree(T, 3); //初始化左子树 PreOrder(T); //先序遍历 system("pause"); return 0; } void InitTree(BiTree const B, int i) { B->data = 2; BiTree S = B; while (i-- > 0) { S->Lchild = (BiTree)malloc(sizeof(BiTNode)); S->Lchild->data = i; S = S->Lchild; } S->Lchild = NULL; }



