關於如何理解連結串列結構體指標引用LinkNode * &L的問題
阿新 • • 發佈:2018-11-12
初學資料結構,在學習的過程中有了這個疑問,已經理解其中緣由,特寫篇部落格和大家一起分享交流。
C++中的引用:&
int a=10;
int &ra=a;
注意:此處&是識別符號,不是取地址符!
a是目標原名稱,ra是引用名,由引用的作用“引用就是某一變數(目標)的一個別名,對引用的操作與對變數直接操作完全一樣。”可知當改變ra的值時,a的值也會隨之改變。
此處主要講的是引用的<傳遞可變引數>的作用,如一下程式碼
c形式:
void swapint(int *a,int *b) { int temp; temp=*a; *a=*b; *b=temp; }
c++形式:
void swapint(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
以上兩種程式碼作用相同,c++形式的程式碼採用了引用的方法,那麼該函式結束後a,b的值也會隨之改變,
int 是所引用變數的型別
連結串列結構體指標的引用
我所使用的教材是武漢大學的教學教材,其中結構體結點的定義如下:
typedef struct node{
ElemType data;
struct node *next;
}Linknode;
幾個常見的連結串列操作的函式:
bool createlink(linknode * &L,elemtype a[],int n)//建立連結串列 bool delete(linknode * &L,int i)//刪除第i個元素e
其他一些相關的語句:
linknode * L;//建立頭結點
L=(linknode *)malloc(sizeof(linknode));//為頭結點分配空間
linknode * L,即聲明瞭一個結構體的指標,L指向的是這個結構體的首地址,記該地址為A1
malloc 為這個結構體指標型別的變數L分配的一個記憶體空間,此時即L指向的地址為A2
linknode * &L,即引用了這個結構體指標型別的變數L,引用L則會改變L,記delete函式執行完後L指向的地址為A3
我自己寫了個簡單的程式,輸出這三個地址,發現:A1!=A2, A2=A3
說明在刪除一個元素之後L指向的地址並沒有發生改變
我試著去掉insert函式用對L的引用符,發現依舊可以正常的刪除,那麼就沒必要用引用符
結論
後來在詢問了老師之後,我最終得到了如下結論:
引用L是為了改變L的值,而L指向的是連結串列的頭結點的地址,即要改變頭結點的地址,但是一般改鏈都是對頭結點之後的結點進行操作,所以頭結點的地址一直沒變,故去掉&後函式依舊可以正常執行。之所以會加&,是以防沒有連結串列是沒有頭結點的那種情況,因為可能會對第一個結點操作,那L的地址就會改變。