最近正複習專業課,到建立二叉樹這裡忽然掉鍊子了。原因無他,全是指標幹的。話不多說,先上乙份**,觀其形。
typedef char elemtype;
//二叉樹的鏈式儲存結構
typedef struct bitnodebitnode,*bitree;
void createbitree(bitree t)
t = (bitree)malloc(sizeof(bitnode));
t->data = data; //樹中結點賦值
createbitree(t->lchild);
createbitree(t->rchild);
}
int main()
printf("樹的值為:\n");
preorder(t); //先序遍歷
return 0;
}
初步來看,好像沒什麼問題,先序遍歷方式遞迴建立子樹。但是執行結果如下:
這不就尷尬了嗎?才到二叉樹建立就發現自己能力不足了,sad....
//以先序方式建立
void createbitree(bitree *t)
q = (bitree)malloc(sizeof(bitnode));
*t = q;
q->data = data; //樹中結點賦值
createbitree(&q->lchild);
createbitree(&q->rchild);
}
int main()
printf("樹的值為:\n");
preorder(t);
return 0;
}
結果如下:(圖中樹的值為a的ascii碼值)
哦哦,完美!
比較前後兩個程式,後者使用二維指標進行了操作,而前者只是使用了一維指標。但是但是,為什麼會出錯呢,指標不是可以直接操作變數值嗎?為什麼傳進去的指標t(指向結點的指標)在子函式裡面分配空間後,仍然為空呢?為什麼呢?
簡單的換個情況測試下,以單鏈表為例:
typedef int elemtype; //定義表元素的型別
typedef struct lnodelnode,*linklist; //linkelist是指標型別,和lnode*等價
void mal(linklist l);
void mal(linklist l)
int main()else
return 0;
}
結果如下:
哦,還真是這樣,指標在子函式裡面分配空間,竟然不行...so terrible!
用二維指標試試:
void mal(linklist *l);
void mal(linklist *l)
int main()else
return 0;
}
結果如下:
嘿嘿嘿,有了!/xyx (手動滑稽)
故博主推斷如下:
無論是指標還是普通變數,在主函式裡面初始化後,若想在子函式裡直接使用並改變它們的值,都需要借助指標來對它們進行操作,即都需要建立它們位址所對應的指標!
換句話說,int b = 1;add(&b);在 void add(int *a)方法中可以直接改變b的值,但是int b = 1;add(b);在void add(int a)方法中b的值根本不會變。同理:
在主函式中定義了bitree t = null;若想分配空間,建立子樹,也需要建立指向bitree的指標,儘管bitree是指向結點的指標。故void createbitree(bitree *t),然後再對*t進行操作,就可以實現二叉樹的建立了。
附帶乙個小例子,自己看吧:
void mal(int **a);
void value(int *b);
void mal(int **a)
void value(int *a)
int main()
結果當然是能輸出2。
順便吐槽一句,習慣了ctrl s真麻煩,尤其是寫部落格的時候....嚶嚶嚶
二叉樹的建立(C語言)
首先是樹結點的結構 struct treenode typedef struct treenode tnode typedef struct treenode t pointer 這沒什麼說的。建樹的 void build tree t pointer t else 輸出樹 t pointer pr...
二叉樹的建立(C語言)
1.p q 1 其中p為頂點,q為邊 2.結點的度 子樹的個數,樹的度 結點度的最大值 3.連通且無圈 由於所有的樹都可以轉化為二叉樹,下列出二叉樹的性質 1.結點數的最值問題 1 第i層的結點數最多為 2 i 1 2 深度為k的二叉樹中,結點數最多為 2 k 1 2.葉子結點個數 與 度為2的結點...
c語言的二叉樹的建立
include include include define m 100 定義最大的節點數 建立二叉樹的型別 typedef struct tnode bintree 定義指標變數 輸入字串返回二叉鍊錶 bintree ceartetree char str else top 指標後移 s top ...