2013-04-23 35 views
0

通過D.S.Malik的書「使用C++的數據結構」 我有點疑惑關於以下搜索功能,(對於鏈表)派生類中的搜索功能,循環條件

據馬利克,「如果搜索項目是在列表中的個項目中,while循環執行我次,以下是從書中確切的代碼(沒有評論)。

template <class Type> 
bool unorderedLinkList<Type>::search(const Type& searchItem) const 
{ 
    nodeType<Type> *current; 
    bool found = false; 
    current = first; 

    while (current != NULL && !found) 
     if (current->info == searchItem) 
      found = true; 
     else 
      current = current->link; 
    return found; 
} 

將這個循環確實停止一旦該項目被發現?

while (current != NULL && !found) 

我的直覺告訴我,它會保持與那些去&運營商,但我可能是錯的。這只是書中的一個錯字,還是我錯過了一些東西?

另一個問題是我的編譯器抱怨的以下行。

current = first; //error 'first' was not declared in this scope 

因此,要解決這個問題,我

current = searchItem.first; 

編譯器取代現在不抱怨,但它從父類訪問權保護的成員? (unorderedLinkList從linkedListType父類,它保護了nodeType<Type> *first構件繼承)

編輯: 更多代碼:d

template <class Type> 
struct nodeType 
{ 
    Type info; 
    nodeType<Type> *link; 
}; 



template <class Type> 
class linkedListType 
{ 
public: //some removed for space 
     virtual bool search(const Type& searchItem) const = 0; 

protected: 
    int count; 
    nodeType<Type> *first; 
    nodeType<Type> *last; 

private: 
    void copyList(const linkedListType<Type>& otherList); 
    //function to make a copy of otherlist and assign to this list 
}; 

編輯: 派生類

template <class Type> 
class unorderedLinkedList: public linkedListType<Type> 
{ 
public: 
    bool search(const Type& searchItem) const; 
} 

編輯: VS快車編譯我的代碼,但這個網站不會。請幫助? T_T http://ideone.com/SN2R99

回答

2

while (current != NULL && !found)很好。

用詞語 - 「雖然我們不在列表的最後(這是current != NULL的意思)該項目尚未找到」。所以如果我們要麼在列表的末尾,要麼找到了這個項目,那麼這個條件將不再是真實的。

您也可以將它翻譯爲while (!(current == NULL || found))(使用De Morgan's laws),它鬆散地表示「當我們在列表的末尾或物品已找到時停止」。要了解「停車時」的邏輯,想想簡單的情形:

  • while (!true),這是while (false),其鬆散的意思是「停止時真」(由此瞬間)
  • while (!false),這是while (true),其鬆散指(因此從不)

first是不是因爲定義......嗯,我不是很確定,它的存在在某個地方標準「時,假停」(這我不上專家),C++有時候很奇怪。 Related question。解決方法:

  • using linkedListType<Type>::first在類
  • 通過this->first
  • 更換first通過linkedListType<Type>::first
+0

由於更換first,我有點DERP時刻存在的誤解和它。所以現在發現是真的,!發現不再是不正確的,結束了循環。我會添加更多的代碼來幫助澄清我的第二個問題。 – user2280041 2013-04-23 13:37:35

+0

-____- 你說得對,它在VS Express中運行良好。 我試圖用gcc在代碼塊中運行它,它一直給我帶來麻煩。 我一直猶豫移動到VS爲我的編碼,因爲我開始在codeblocks,但我想這是最後一根稻草。 感謝您的幫助,非常感謝! – user2280041 2013-04-23 13:57:37

+1

VS接受它,但你鏈接我的那個網站沒有。它也給編譯器錯誤。在這裏,看看。 :/ http://ideone.com/SN2R99 – user2280041 2013-04-23 14:10:02