2017-03-27 56 views
1

所以這是一個簡單搜索樹中的節點的代碼基於該id節點:我得到一個函數的警告,我不知道如何編寫函數,所以我不會再得到這個警告

NodeT *searchNode(NodeT *parent, int id) 
{ 
    if(parent == NULL) printf("\nThere is no tree."); 
    if(parent->id == id) 
     return parent; 
    else 
    { 
     if(parent->left != NULL) searchNode(parent->left, id); 
     if(parent->right != NULL) searchNode(parent->right, id); 
    } 
} 

而且我得到這樣的:警告:控制到達非void函數[-Wreturn型]的結束|

節點的定義如下:

typedef struct node_type 
{ 
    char id; 
    struct node_type *left, *right; 
} NodeT; 

有沒有什麼辦法可以擺脫警告?

+3

該警告非常明確。如果'parent-> id!= id',函數返回什麼?函數必須**總是**返回一些東西,如果你聲明他們這樣做。 – StoryTeller

+1

[「警告:控制達到非void函數結束」的可能重複,但實際上該函數聲明爲int並返回一個int](http://stackoverflow.com/questions/10964528/warning-control-reaches-end非虛函數,但實際上是功能) – StoryTeller

+0

謝謝,你的答案幫了我很多。我計算出如果我將替換'if(parent-> left!= NULL)'searchNode(parent-> left,id);'with'return searchNode(parent-> left,id);'那麼程序將正常運作,沒有任何警告。下一行也一樣:'if(parent-> right!= NULL)searchNode(parent-> right,id);'。 – ISimion

回答

0

你的函數在某些情況下只返回一些東西。警告告訴你,在任何情況下你都需要退貨。這對你的代碼來說是一個非常重要的警告,因爲它也突出了一些錯誤。

if(parent == NULL) printf("\nThere is no tree."); 
if(parent->id == id) 

如果parentNULL會發生什麼?它打印出錯誤信息,然後繼續到下一行並將崩潰。如果第一個if的第一個if的值爲真,那麼該代碼不會繼續執行,或者將其餘的功能代碼放入其他代碼塊中。

接下來,如果您的樹中有幾個節點會發生什麼?你遍歷樹,但忽略結果!如果您搜索不存在的節點,您也不會爲此返回任何內容。

因此,如果您無法找到結果或將遞歸調用的結果返回給它,您應該將其更改爲return NULL

相關問題