學習二叉樹的建立時,利用先序遍歷建立二叉樹的過程中我遇到了一個一直沒有理解清楚的問題,那就是結構體指針使用問題.結構體還是可以理解清楚的,但是自從它和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 在一塊的。