关于递归和函数返回值的一个问题

NeilHappy 2012-01-17 03:06:37
下面一段代码:

//返回父亲结点
void *parent(NODE *&pNode,NODE *&p,NODE *head)
{
if(head!=NULL)
{
if(head->pLeft==pNode || head->pRight==pNode)
{
p=head;
return p; //问:为什么这里必须要返回一个指针?
}
if(head->pLeft!=NULL)
parent(pNode,p,head->pLeft);
if(head->pRight!=NULL)
parent(pNode,p,head->pRight);
}
}

这个parent函数没有返回值,但是如果我把return p去掉就会报错,错误信息是编译器需要一个返回值。如果您知道原因,请告诉小弟我,非常感谢。
...全文
162 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
NeilHappy 2012-01-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 czh3642210 的回复:]

C/C++ code
if(head->pLeft!=NULL)
return parent(pNode,p,head->pLeft);
if(head->pRight!=NULL)
return parent(pNode,p,head->pRight);
[/Quote]
谢谢指导,但是我之前也是这样做的,也设置了返回空指针NULL。我认为这样做的错误是当查找到一个叶子结点时,就会返回NULL,就会终止,所以会出错。
NeilHappy 2012-01-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 gqjjqg 的回复:]

C/C++ code
//返回父亲结点
void *parent(NODE *&pNode, NODE *head)
{
void *ret = NULL;
if(head==NULL || pNode==NULL) //边界1 叶子节点 or pNode参数不对
{
return ret;
}
//这里不知道你为什么这么做……
[/Quote]
非常感谢,我明白了。
面包大师 2012-01-17
  • 打赏
  • 举报
回复
if(head!=NULL)//额。。。在这个大if语句外面加个
return NULL;
gqjjqg 2012-01-17
  • 打赏
  • 举报
回复
//返回父亲结点  
void *parent(NODE *&pNode, NODE *head)
{
void *ret = NULL;
if(head==NULL || pNode==NULL) //边界1 叶子节点 or pNode参数不对
{
return ret;
}
//这里不知道你为什么这么做,如果你确定比较的是他们的地址。
if(head->pLeft==pNode || head->pRight==pNode) //边界2 找到节点
{
return (void *)head;
}
if(head->pLeft != NULL) {
ret = parent(pNode,p,head->pLeft);
if(ret != NULL) { //找到节点直接返回剩下的不搜。
return ret;
}
}
if(head->pRight!=NULL) {
ret = parent(pNode,p,head->pRight);
if(ret != NULL) { //找到节点直接返回剩下的不搜。
return ret;
}
}
return ret; //找不到节点。
}
Antineutrino 2012-01-17
  • 打赏
  • 举报
回复
还不结贴,这么低级的错误也犯,知道丢人两个字怎么写不!
面包大师 2012-01-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 neilhappy 的回复:]
。。。递归应该如何设计?我一直没想清楚这个问题。
[/Quote]
我上面那种。。。设计,别的不变
面包大师 2012-01-17
  • 打赏
  • 举报
回复
        if(head->pLeft!=NULL)
return parent(pNode,p,head->pLeft);
if(head->pRight!=NULL)
return parent(pNode,p,head->pRight);
ANT2AUNTH 2012-01-17
  • 打赏
  • 举报
回复
你的函数类型是空型指针
NeilHappy 2012-01-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 saleayas 的回复:]

你这个函数可以编译吗?
会有警告的。
不是所有路径都有返回值。
[/Quote]
我本来想返回父亲结点,但是没处理好递归的关系,所以我就用了一个折中的办法,传入一个引用,把parent赋值给这个引用。我用的是vs2010,编译没有警告。可不可以请教一下,如果需要返回parent,递归应该如何设计?我一直没想清楚这个问题。
NeilHappy 2012-01-17
  • 打赏
  • 举报
回复
谢谢各位啊。我居然犯了一个这么低级的错误。
gqjjqg 2012-01-17
  • 打赏
  • 举报
回复
这里有返回值 void *
IVERS0N 2012-01-17
  • 打赏
  • 举报
回复
void *parent

void *为无类型指针,
Saleayas 2012-01-17
  • 打赏
  • 举报
回复
你这个函数可以编译吗?
会有警告的。
不是所有路径都有返回值。
面包大师 2012-01-17
  • 打赏
  • 举报
回复
void *parent(NODE *&pNode,NODE *&p,NODE *head)//把这个地方的*号去掉改成下面的,声明的地方也改
void parent(NODE *&pNode,NODE *&p,NODE *head)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧