我得到一个函数的警告,我不知道如何编写函数,所以我不会再得到这个警告
问题描述:
所以这是一个简单搜索树中的节点的代码基于该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;
有没有什么办法可以摆脱警告?
答
你的函数在某些情况下只返回一些东西。警告告诉你,在任何情况下你都需要退货。这对你的代码来说是一个非常重要的警告,因为它也突出了一些错误。
if(parent == NULL) printf("\nThere is no tree.");
if(parent->id == id)
如果parent
是NULL
会发生什么?它打印出错误信息,然后继续到下一行并将崩溃。如果第一个if
的第一个if
的值为真,那么该代码不会继续执行,或者将其余的功能代码放入其他代码块中。
接下来,如果您的树中有几个节点会发生什么?你遍历树,但忽略结果!如果您搜索不存在的节点,您也不会为此返回任何内容。
因此,如果您无法找到结果或将递归调用的结果返回给它,您应该将其更改为return NULL
。
该警告非常明确。如果'parent-> id!= id',函数返回什么?函数必须**总是**返回一些东西,如果你声明他们这样做。 – StoryTeller
[“警告:控制达到非void函数结束”的可能重复,但实际上该函数声明为int并返回一个int](http://stackoverflow.com/questions/10964528/warning-control-reaches-end非虚函数,但实际上是功能) – StoryTeller
谢谢,你的答案帮了我很多。我计算出如果我将替换'if(parent-> left!= NULL)'searchNode(parent-> left,id);'with'return searchNode(parent-> left,id);'那么程序将正常运作,没有任何警告。下一行也一样:'if(parent-> right!= NULL)searchNode(parent-> right,id);'。 – ISimion