2012-11-24 71 views
2

我有問題返回指向結構的指針。有人可以解釋我做錯了什麼嗎?我想讓search()返回一個指向匹配輸入的指針。這將被存儲到一個向量中,以防它們在「數組」中重複。這似乎工作,但我無法從指針返回「數據」?結構內的指針問題

struct Node 
{ 
    int data; 
    Node *left; 
    Node *next; 
}; 

vector<Node *> array; 


void find(int & input) 
{ 
    currentSize = 0; 
    vector<Node *> hold; 

    for(int i = 0; i < array.size(); i++){ 
     if(search(array[i], input) != NULL) 
     { 
      hold.push_back(search(array[i], input)); 
     } 
     else{ 
      cout << "The Key is not found" << endl; 
     } 

    } 

    for(int i = 0; i < hold.size(); i++) 
    { 
     cout << hold[i] << endl; 
     //Problem here:: I want to see the "data" that the search function returned not the hex value 
    } 
} 


Node * search(Node * x, const int & input) 
{ 
    if(x == NULL) 
    { 
     return NULL; 
    } 
    else 
    { 
     if(input == x->element) 
     { 
      return x; 
     } 
      search(x->left, input); 
      search(x->next, input); 
    } 
} 
+0

我想,你的X->搜索()函數元素贏得的結果也不能編譯。正如扎克指出的那樣,你的編碼標準有點弱。但至少你在努力。隨着時間的推移,你會學會假設你堅持下去。 –

回答

3

您需要打開編譯器警告。

並不是所有的搜索代碼路徑都返回一個值,特別是如果你的編譯器沒有腦死亡,你應該得到的警告。

爲了解決這個問題,替換此:

  search(x->left, input); 
      search(x->next, input); 
    } 
} 

有:

  Node* leftSearch = search(x->left, input); 
      if (leftSearch) 
       return leftSearch; 
      return search(x->next, input); 
    } 
} 

search()遞歸調用不會自動切換到當前函數的返回值運送它們的返回值。 :)

另外,正如Zack指出的那樣,您需要查看Node的某個子字段才能打印它。首先檢查返回值是否爲nullptr(或在支持非C++ 11的編譯器中爲NULL)(如果它爲空,則無法安全地取消引用它,並且表示搜索失敗)。

如果它不是nullptr',請在打印之前對其執行->data

也就是說,變化:

cout << hold[i] << endl; 

到:我不是使用std::endl,因爲我不認爲有必要衝洗每行緩衝

if (hold[i]) { 
     cout << "Found: " << hold[i]->data << "\n"; 
    } else { 
     cout << "Not Found\n"; 
    } 

音符。

+0

我按照您建議的Yakk進行了更改,它的工作原理非常感謝。不過,我有點理解爲什麼搜索()的變化確實有效。我試圖找到所有的地方的X - >數據匹配的輸入,並返回該指針,但在代碼中Node * leftSearch = search(x-> left,input); 如果(leftSearch) 返回leftSearch; return search(x-> next,input); – user1771695

+0

其實是否仍然檢查(輸入== X->元素)? – user1771695

+0

這是遞歸推理。你可能還沒有見過感應,對嗎?但這個想法是遞歸調用搜索將只返回非空,如果* *任何關閉該節點有答案。如果它返回非null,它已經找到了答案,所以我們不必檢查它,並且可以將其中繼。如果它返回null,我們檢查另一個節點指針,看看裏面是否有答案。 – Yakk

1

您打印hold[i],這是一個指向一個節點,而不是hold[i]->data,這是它似乎你想打印。

另外,這段代碼幾乎肯定會像篩子一樣泄漏和/或破壞堆,但是您沒有顯示足夠的代碼來告訴您存在哪些問題。

+0

當我打印hold [i] - > data時,我得到了一些不可讀的字符,然後是seg故障。 – user1771695

+0

@ user1771695這意味着'hold [i]'指向節點以外的其他東西。 – zwol

0
 search(x->left, input); 
     search(x->next, input); 

這兩個調用的結果只是被忽略。你或許應該存儲第一個搜索結果,如果不是NULL,返回它,否則返回第二個搜索

Node* res = search(x->left, input); 
if (res) return res; 
return search(x->next, input);