2014-09-20 91 views
0

爲什麼如果我想在鏈表中添加節點,雙遞歸指針對遞歸是必需的。它應該與單指針一起工作。遞歸中需要雙指針

下面的代碼是不是爲我工作

class LinkedList 
{ 
private: 
    struct Node 
    { 
     int data; 
     Node* link; 
    }*Ptr; 
public: 
    LinkedList() 
    { 
     Ptr = NULL; 
    } 

    void Add(int num) 
    { 
     /*Add(&Ptr, num);*/ 
     Add(Ptr, num); 
    } 

    void Add(Node* Ptr, int num) 
    { 
     Node* tmp = NULL; 

     if (Ptr == NULL) 
     { 
      tmp = new Node; 
      tmp->data = num; 
      tmp->link = NULL; 
      Ptr = tmp; 
     } 
     else 
     { 
      Add(Ptr->link, num); 
     } 
    } 

    void Display() 
    { 
     Node *tmp; 
     tmp = Ptr; 

     while (tmp != NULL) 
     { 
      cout <<tmp->data << endl; 
      tmp = tmp->link; 
     } 
    } 
} 


int main() { 

LinkedList l; 

    l.Add(10); 
    l.Add(20); 
    l.Add(30); 
    l.Add(40); 
    l.Add(50); 

    l.Display(); 

    _getch(); 
    return 0; 

} 
+0

'PTR = TMP;'意味着*不*給調用者在'添加() '(實際上會發生內存泄漏)。您使用的參數'Ptr'與成員名稱相同('Ptr')沒有幫助(通常不太合適)。您需要通過地址或引用來傳遞您要修改的指針。這是C++,你可以猜測首選項(你是否被允許使用它們)。 – WhozCraig 2014-09-20 06:26:35

回答

3

「雙指針」是必需的,因爲您要更改函數中指針的值。

看也不看你的代碼,看看這個非常簡單的例子:

void foo(int *x) 
{ 
    x = new int[10]; 
} 

int main() 
{ 
    int *p = 0; 
    foo(p); 
    // why is p still NULL? 
} 

您將看到的p值沒有變化,即使功能明顯改變了傳遞的參數。問題是x是一個臨時變量,一旦函數退出,對x的任何更改都會消失。

要解決此問題,則必須將指針傳遞到指針,或將指針的引用:

void foo(int** x) 
{ 
    *x = new int[10]; 
} 

void foo2(int *& x) 
{ 
    x = new int[10]; 
} 

int main() 
{ 
    int *p = 0; 
    foo(&p); // now p will change 
    delete [] p; 

    p = 0; // try again 
    foo2(p); // p also changes here 
    delete [] p; 
} 
0

當我有指針的問題,我該怎麼辦,(什麼用來做),是(用鏈表專門)繪製,... 我還沒有運行代碼,但我不完全可以打電話給你的班級1 ... 第二,它看起來像你的列表指針總是在列表的最後一個元素... 因此,如果它運行,它會讀取的唯一元素是最後一個... 嘗試使用調試器,並看看您的添加過程,或顯示...