*通俗點來說,指標就是位址,位址就是指標。指標可以理解為一種資料型別和其他資料型別,如int、float、一樣,是存放資料的一種型別。只不過存放的是記憶體中的位址罷了。例如:int i ,這個變數,記憶體中給它開了乙個房間,房間的編號為110(注意記憶體中不是這樣的位址,方便理解)。這個編號就是它在記憶體中的位址。你可以向這個房間裡放數字,而int w,這個指標則專門存放位址(編號)的。其他的也是如此。
如果知道了一級指標,就不難理解二級指標。如果說指標存放變數的位址,那麼,二級指標就存放一級指標的位址。也就是,位址的位址。
函式我的理解是將一部分要實現的內容封裝在乙個空間裡,以後你要用時,可以直接拿來用,而不用在重新寫了。但函式有其自身的一些特點,函式在被呼叫時,記憶體為其開闢一塊空間,在呼叫完後,空間就被清除了。所以這也就導致了在函式無法對變數的值直接修改,需要對其記憶體中位址所存的值進行修改。另外在給函式傳參時,也要注意,有兩種不同情況:
第一種:傳參為一種變數的形式,這種情況下,相當於將實參copy了一下,形參相當於實參的副本,但函式執行結束後,形參也消失了。並不能改變實參的值,可以參考兩個數交換的函式例子。
第二種:傳指標或位址的方式,這種方式形參接收乙個位址,形參也指向了這個位址所代表的記憶體。函式執行結束後,形參指向消失。
二叉樹的建立有很多種方法,但其本質來說都差不太多,無非是通過一定的演算法來進行構造。
我們來看一下先序構造(採用遞迴)的幾種方法:
首先是結構體:
typedef struct btnode
*tree;
1.無參構造
btnode *
creatbtree()
; btnode * d;
//結點
printf
("輸入資料\n");
scanf
("%s"
,date)
; i =
strcmp
(date,
"*")
;//當輸入*時表示輸入為null,判斷是否輸入的為*
if( i !=0)
else
return d;
}
(1)無參構造雖然沒有引數,但卻返回乙個指標,來確保找到根結點。
(2)d這個指標負責儲存動態建立的記憶體空間的位址,另外應為c語言無法輸入null,所有我用 *來表示輸入null,然後用strcmp來判斷,用int i來接收,通過判斷i是否為0,如果i = 0,說明想輸入為null,d = null。反之,則開闢新空間,採用遞迴方法重複上面過程。(函式srcmp的用法](
2.二級指標
void
creatbtree
(btnode *
* a)
//必須傳入乙個指標的位址
;printf
("輸入資料\n");
scanf
("%s"
,date)
; i =
strcmp
(date,
"*");if
( i !=0)
else
}
(1)二級指標建立開始寫的時候老不明白為什麼要用二級指標,為什麼不能用一級指標(吐槽:後來,才明白兩種方法都可以)。二級指標建立依然和之前的思路差不多,你要建立乙個個結點,且還可以找到根結點。
(2)前面部分和無參一樣,就不多贅述。主要解釋一下if語句中的部分,二級指標是指標的指標,存放的是指標的位址。所有你開始要用乙個指標來儲存動態建立的結點空間的位址,因為你用遞迴方法,如果用一級指標方法,再呼叫形參的指標,你之前的儲存根節點位址就被覆蓋了,這樣無法找到根節點位址了(當然可以返回根結點位址,這個在一級指標建立中,就是這樣用的),但用二級指標就可以直接對指標內容進行操作。當再次呼叫形參時,之前建立的根結點的空間位址就在實參中了。
3.一級指標構造
btnode *
creatbtree
(btnode * d)
//引數的輸入必須為乙個一級指標
;printf
("輸入資料\n");
scanf
("%s"
,date)
; i =
strcmp
(date,
"*")
;//當輸入*時表示輸入為null,判斷是否輸入的為*
if( i !=0)
else
return d;
//返回根節點的值
}
一級指標的建立和無參構造原理上一樣,不同點在於btnode *指標的位置,是作為引數還是作為函式的乙個變數來進行二叉樹的建立。如果傳入的是乙個變數的位址,因為這個變數本身已經在記憶體中開闢一塊空間,*d = (btnode)malloc(sizeof(btnode))**的話,那引數d不在指向你傳入的那個變數空間了。當然,你後續再用乙個指標來接收返回的位址,結果倒也一樣。不過你前面變數就顯得多餘了。
其實來說兩者的區別就像一級指標和變數的區別一樣,變數位址儲存在指標中,你可以通過指標來操作相應位址對應記憶體的值。而二級指標則通過它儲存的一級指標的位址來操作一級指標指向的記憶體內容。
二叉樹學習(一)二叉樹基礎
最近準備學習一下資料結構,二叉樹當然是必須要了解的了。網上看了一些貼子,順便把重要的內容就記下來了,有需要的同學可以看看,入門看很有幫助。1.1 定義 1.2 結點的度 1.3 結點關係 1.4 結點層次 2.1 定義 2.2 二叉樹特點 每個結點最多有兩顆子樹,所以二叉樹中不存在度大於2的結點。左...
建立二叉樹 後序建立二叉樹
由後序遍歷可知,輸入順序是左結點 右結點 子樹根結點 比如輸入如下樹 ab cde 輸入序列為 e d b c a 思路 使用棧,對左結點和右結點進行壓棧 1.當輸入遇到非 且棧中元素大於等於2,則可以確定乙個小三角樹形,並將這個樹根作為下乙個小三角樹形的乙個子節點 2.當輸入遇到非 但棧中元素小於...
二叉樹相關演算法(一) 二叉樹的遍歷
遞迴方式會導致每個節點會經過三次,先序是在第一次經過節點時訪問,中序是第二次經過節點時訪問,後序是第三次經過節點時訪問。其中較為特殊的是葉子節點,左孩子和右孩子都為空,訪問空樹時什麼都不做就返回。public static void p node h 1 利用棧來進行實現,三種演算法在理解的基礎上進...