2011-05-23 133 views
2

任何幫助都將有所幫助。我寫了一個代碼來查找兩個鏈表的聯合。但是,我正在一個部分獲得無限循環。我在代碼中指出它。請幫我找出錯誤。謝謝。兩個鏈接列表的聯合 - C++

//Finds the union of two linked lists. 
nodeType* unionLL(nodeType *&headA, nodeType *&headB) 
{ 
     nodeType *tempA, *tempB, *newNode;   
     tempA = headA; 
     tempB = headB; 
     bool match = false; 

     while (tempB -> link != NULL) 
     { 
      while (tempA -> link != NULL)     
      { 
        outfile <<"The infinite loop occurs here " << endl; 
        if (tempB -> intVal == tempA -> intVal) 
        { 
         match = true; 
        } 
        tempA = tempA -> link; 
      } 

      if (!match) 
      { 
       newNode = new nodeType; 
       newNode -> intVal = tempB -> intVal; 
       newNode -> link = NULL; 
       tempA -> link = newNode; 
      } 
      tempA = headB; 
      tempB = tempB -> link; 
     } 

     return headB; 
} 
+0

把它們放入std :: set怎麼樣? – xDD 2011-05-23 23:36:47

+0

如果這是一個家庭作業問題,請閱讀http://meta.stackexchange.com/questions/10811/how-to-ask-and-answer-homework-questions – MatrixFrog 2011-05-23 23:36:47

+2

評論:'' - >''操作符綁定非常嚴格的邏輯;不要在代碼兩邊都寫空格......對於有經驗的程序員來說看起來很奇怪。 – 2011-05-23 23:42:34

回答

4

您還沒有確定鏈表是否已排序 - 所以我們不應該假設。您尚未確定哪些列表可以修改;從表面上看,這兩個列表都可以被該函數修改。您返回headB,這表明結果應該是可從headB訪問的結果集應該包含該列表中的每個元素,並且還可以爲從headA訪問的每個元素添加一個新元素,該元素尚未通過headB找到。

從表面上看,那麼,你的僞代碼應該是:

foreach element in listA 
    if (element not found in listB) 
     add copy of element to listB 

留下原封不動listA的。你的代碼沒有實現這個邏輯。

+0

非常感謝。我將再次處理我的代碼,並使用您提供給我的僞代碼對其進行重構。這真的很有幫助。謝謝。 – ck22 2011-05-24 04:58:32

0

我想你不檢查它是否匹配tempA循環(在B的都沒有)