1. 程式人生 > >關於如何理解連結串列結構體指標引用LinkNode * &L的問題

關於如何理解連結串列結構體指標引用LinkNode * &L的問題

初學資料結構,在學習的過程中有了這個疑問,已經理解其中緣由,特寫篇部落格和大家一起分享交流。

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的地址就會改變。