2017-03-27 29 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

相关问题