首先來看一下簡單有關鏈表操作的函數宣告
void initLink(pNode *p); //初始化頭指針
void print(pNode p); //列印鏈表的值
int getLength(pNode p); //獲取鏈表的長度
//在指定位置上插入一個數據
void addByIndex(pNode *p,int index,int val);
第一個函數,傳入的是指針,指向鏈表的頭結點指針,此時在主函數中 pNode head;只是對頭結點的一個宣告,要使用的話必須在ininLink函數中實現分配記憶體,傳參的本質是在記憶體新開闢一個空間,如果傳的參數是 pNode p,程式會在新開闢的空間中重新宣告一個p,這個與主函數的p有不一樣的記憶體地址,所分配的空間指向爲新宣告的p,無法爲主函數中p分配空間。當傳入是pNode p 時,爲p分配的記憶體就是主函數中p的記憶體,此時的p爲指向主函數head的指針。
弄懂函數傳參原理後,對後面幾個函數就有很好的理解。
第二個函數傳的pNode p,此時的p相當於head的副本,但副本中next的指向與主函數中head的next指向是相同的,相當於有兩頭指針同時指向一個鏈表。此函數是實現列印功能的,所以要小心數據的修改。
第三個函數與第二個函數差不多。
大部分都是這種情況!
第四個函數,傳參是pNode *p,在這裏其實跟傳pNode p的效果是一樣的,只是爲了不用重新在爲頭結點建立副本,也可以用帶返回值的函數。
總的來說,指針功能是非常的強大的,用得好的話,可以事半功倍,不好的話,就一大堆記憶體溢位問題。技術有限,還望多多包涵
!