[已经付上短小易读的代码了]二叉树,关于指针与引述,提示不能将“BiTree*”类型的值赋给”BiTree“实体。对指针有研究的大神看下呗
[已经付上短小易读的代码了]二叉树,关于指针与引用,提示不能将“BiTree*”类型的值赋给”BiTree“实体。对指针有研究的大神看下呗
代码如下。其中"#"是代表空。一开始我用的单纯的指针作为形参,后来发现在函数中malloc后指针仍指向NULL(因为我改变的是指针的指向,而不是内容)。
后来我就想到了使用二级指针,但是在21行提示:不能将“BiTree*”类型的值赋给”BiTree“实体
我觉得*T应该是H的意思啊,仍然还是指针啊,为什么不能赋值啊??
(作业我已经通过函数返回值的方式做好了,但这种方式为什么不行还是不太明白)
------解决方案--------------------
修改为:
或者
代码如下。其中"#"是代表空。一开始我用的单纯的指针作为形参,后来发现在函数中malloc后指针仍指向NULL(因为我改变的是指针的指向,而不是内容)。
后来我就想到了使用二级指针,但是在21行提示:不能将“BiTree*”类型的值赋给”BiTree“实体
我觉得*T应该是H的意思啊,仍然还是指针啊,为什么不能赋值啊??
(作业我已经通过函数返回值的方式做好了,但这种方式为什么不行还是不太明白)
#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<stdlib.h>
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree; //分别为结构体和指向结构体的指针
void CreateBiTree(BiTree *T) //接受指针的指针,这时的T指向指针H
{
char ch;
scanf("%c",&ch);
printf("%c@\n",ch);
if(ch=='#')
{
printf("执行T=NULL\n");
*T=NULL; //改变T的内容,即H指向NULL
}
else
{
(*T)=(BiTree*)malloc(sizeof(BiTNode)); //改变T的内容,即H指向新的空间
(*T)->data=ch;
printf("执行T->data=ch\n");
CreateBiTree(&(*T)->lchild);//再次把指针的地址传入下次的函数
CreateBiTree(&(*T)->rchild);
}
}
void PreOrderTraverse(BiTree T)
{
if(T)
{
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
else
{
printf("T不存在!\n");
}
}
int main()
{
BiTree H; //声明一个指针
printf("please input data:");
CreateBiTree(&H); //把指针的地址传入函数
PreOrderTraverse(H);
system("pause");
return 0;
}
------解决方案--------------------
(*T)=(BiTree*)malloc(sizeof(BiTNode)); //改变T的内容,即H指向新的空间
修改为:
(*T)=(BiTree)malloc(sizeof(BiTNode)); //改变T的内容,即H指向新的空间
或者
(*T)=(BiTNode*)malloc(sizeof(BiTNode)); //改变T的内容,即H指向新的空间