学习二叉树的建立时,利用先序遍历建立二叉树的过程中我遇到了一个一直没有理解清楚的问题,那就是结构体指针使用问题.结构体还是可以理解清楚的,但是自从它和typedef 还有指针 “勾搭” 在一起后,就让我有了一丝的困惑.这到底是怎么回事呢?终于我忍不住了,想要彻底调查清楚它们之间的猫腻。
- 一起来看下面这个程序(不是完整的测试用例)
#include<stdio.h>
typedef struct TreeNode{
TNType _value;
struct TreeNode* _left;
struct TreeNode* _right;
}TreeNode, * Bitree;
void CreateTree(Bitree* root){
TNType node;
scanf("%c", &node);
if (node == '#'){
*root = NULL; //叶子结点的产生
}
else{
*root = (Bitree)malloc(sizeof(TreeNode));
(*root)->_value = node;
CreateTree(&(*root)->_left);
CreateTree(&(*root)->_right);
}
}
void TestTree(){
Bitree tree;
printf("请输入建立二叉树的结点值:");
CreateTree(&tree);
}
int main(){
TestTree();
return 0;
}
在翻看别人的博客的时候,有人说这里的Bitree是指针变量.于是我就更加迷茫了,如果Bitree是指针变量的话,那它为什么还可以定义其他的变量(变量tree)呢?
- 于是我按照那片博客所说做了如下测试
#include<stdio.h>
typedef struct TreeNode{
TNType _value;
struct TreeNode* _left;
struct TreeNode* _right;
}TreeNode, * Bitree;
void CreateTree(Bitree* root){
TNType node;
scanf("%c", &node);
if (node == '#'){
*root = NULL; //叶子结点的产生
}
else{
*root = (Bitree)malloc(sizeof(TreeNode));
(*root)->_value = node;
CreateTree(&(*root)->_left);
CreateTree(&(*root)->_right);
}
}
void TestTree(){
/*
struct TreeNode *node;
node ptr;
*/
//这是我加入其中的两行代码
Bitree tree;
printf("请输入建立二叉树的结点值:");
CreateTree(&tree);
}
int main(){
TestTree();
return 0;
}
在加入了上述的两行代码后,我发现编辑器给我报错了.于是我觉得那篇博客误导了我.
- 于是我又做了如下的测试
#include<stdio.h>
typedef struct TreeNode{
TNType _value;
struct TreeNode* _left;
struct TreeNode* _right;
}TreeNode, * Bitree;
void CreateTree(Bitree* root){
TNType node;
scanf("%c", &node);
if (node == '#'){
*root = NULL; //叶子结点的产生
}
else{
*root = (Bitree)malloc(sizeof(TreeNode));
(*root)->_value = node;
CreateTree(&(*root)->_left);
CreateTree(&(*root)->_right);
}
}
void TestTree(){
TreeNode node;
typedef TreeNode* p;
p n;
Bitree tree;
printf("请输入建立二叉树的结点值:");
CreateTree(&tree);
}
int main(){
TestTree();
return 0;
}
我在监控中发现我的理解是正确的
- 此处的 Bitree 并非是指针变量,而是typedef 给结构体指针起的别名而已 .
typedef struct TreeNode{
TNType _value;
struct TreeNode* _left;
struct TreeNode* _right;
}TreeNode, * Bitree;
//可以理解成这样
typedef struct TreeNode{
TNType _value;
struct TreeNode* _left;
struct TreeNode* _right;
}TreeNode;
typedef struct TreeNode* Bitree;
- 让人误解的点其实是 * 到底是和谁在一起的.
- 其实在定义结构体的时候它是跟 structural TreeNode 在一块的。