C語言指標問題 二叉樹的建立

2021-08-20 18:52:14 字數 2529 閱讀 4324

最近正複習專業課,到建立二叉樹這裡忽然掉鍊子了。原因無他,全是指標幹的。話不多說,先上乙份**,觀其形。

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 ...