遞迴函式使用引用傳遞的問題
阿新 • • 發佈:2018-11-08
對於演算法:
使用遞迴方法,刪除無頭結點單鏈表中所有值為x的結點。
考慮下面程式:
void Del_X_3(LinkList &L,ElemType x)
{
LNode *p;
if(L==NULL)
return ;
if(L->data==x)
{
p=L;
L=L->next; //問題出在這裡
free(p);
Del_X_3(L,x);
}else
{
Del_X_3(L-> next,x);
}
}
思考該程式發現,會有疑問:
刪除結點p時沒有更改p前結點的指標,是否會造成連結串列短鏈呢?答案是不會。
[分析]
為了簡化,思考連結串列中某三個結點:1,3,5。現欲刪除連結串列中所有3。
第一次遞迴:
L指向1結點,遞迴呼叫Del_X_3(L->next,x);
注意這裡,L->next是什麼?
相當於這個Node*型別的指標L所指向的結點的next域裡面的指標,其儲存的值為下一個結點的地址。也就是(*L).next;
第二次遞迴:
現在進入遞迴的L實際上是(*L).next;
注意:當代碼執行到L=L->next;
這句話其實相當於(*L).next = (*L).next->next;也就是1指向了5!
注意引用傳遞
函式void Del_X_3(LinkList &L,ElemType x)
LinkList使用引用傳遞,這是有原因的。
注意這裡的每一個L都是一個指標,其值都來自於連結串列結點的next域。
那麼我們現在要更改連結串列,就必然要使用指標的引用。
因為這裡我們要更改的是指標本身!而不再是指標所指的物件。