1. 程式人生 > >遞迴函式使用引用傳遞的問題

遞迴函式使用引用傳遞的問題

對於演算法:
使用遞迴方法,刪除無頭結點單鏈表中所有值為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域。
那麼我們現在要更改連結串列,就必然要使用指標的引用。
因為這裡我們要更改的是指標本身!而不再是指標所指的物件。