2016-09-10 57 views
1

我試圖通過List類中的每個節點遞歸移動來查找某個整數是否存在於列表中的某個節點中。C++:使用遞歸在List中查找int - 何時返回

這是我的頭文件:

class List 
{ 
public: 
    bool find(int d) const { return false; } 
private: 
    Node *head; 

    bool findNode(const Node*, int) const; 
}; 

下面是兩個函數的代碼:

bool List::find(int d) const 
{ 
    return findNode(head, d); 
} 

bool List::findNode(const Node* n, int d) const 
{ 
    if (n == NULL) 
     return false; 
    else if (n->data == d) 
     return true; 
    else 
     findNode(n->next, d); 
} 

現在,這裏是我的問題:我是不是由findNode功能添加if (n == NULL)聲明厄運自己所以它總是返回false?我不認爲我需要這樣做,如果我已經在頭文件中有return false。我應該刪除該行嗎?有沒有更好的方法來做到這一點?

回答

1

if (n == NULL) return false很好,因爲它只會在您到達列表末尾時發生,並且您應該返回false。

第一個問題,我看到的是,線findNode(n->next, d);應該return findNode(n->next, d);

第二個是,你需要從你的頭文件中刪除函數體find()。你不能兩次定義函數體。

因此,完整的代碼是:

class List 
{ 
public: 
    bool find(int d) const; 
private: 
    Node *head; 
    bool findNode(const Node*, int) const; 
}; 

bool List::find(int d) const 
{ 
    return findNode(head, d); 
} 

bool List::findNode(const Node* n, int d) const 
{ 
    if (n == NULL) 
     return false; 
    else if (n->data == d) 
     return true; 
    else 
     return findNode(n->next, d); 
} 
+0

這是有道理的。我討厭頭文件,但是它是由教師給我的,我們不允許改變它(如果你問我...,AWFUL編碼標準)。我根本不會在頭文件中這樣做,但是我猜你會得到你所得到的。 – WitchKing17

1

您需要空校驗因爲這是你如何確定列表的末尾。我想你正在嘗試這個練習,否則顯然你根本不需要遞歸。

+0

是的,我通常不會使用遞歸,因爲它非常昂貴。這是我的一個班。 – WitchKing17