Error: control may reach end of non-void function in C++

Error: control may reach end of non-void function in C++

我无法弄清楚为什么会发生此错误:错误:"control may reach end of non-void function" 即使 "else" 语句出现在最后。

代码如下:

bnode* binsert(bnode *h,int k){
    bnode *temp=new bnode;
    if(h==NULL)
    {
        temp->num=k;
        temp->L=NULL;
        temp->R=NULL;
        h=temp;
        return h;
    }
    else if(h->L==NULL && k<h->num)
    {
        temp->num=k;
        temp->L=NULL;
        temp->R=NULL;
        h->L=temp;
        return h;
    }
    else if(h->R==NULL && k>h->num)
    {
        temp->num=k;
        temp->L=NULL;
        temp->R=NULL;
        h->R=temp;
        return h;
    }
    else if(h->L!=NULL && k<h->num)
    {
        h->L=binsert(h->L,k);
    }
    else
    {
        h->R=binsert(h->R,k);
    }
}

因为这最后两个条件:

else if(h->L!=NULL && k<h->num)
{
    h->L=binsert(h->L,k);
}
else
{
    h->R=binsert(h->R,k);
}

可能会发生并且没有给出 return...

您需要确保函数 return 是一个值,无论条件计算的是什么....

else if(h->L!=NULL && k<h->num)
{
    h->L=binsert(h->L,k);
}
else
{
    h->R=binsert(h->R,k);
}

在您的代码的 else ifelse 情况下,如果您到达此处,您不会 return 一个值,如果您尝试使用此行为,则行为未定义值。

您可能想在两个分支中添加一个return h;

您需要return递归调用的结果,它不会自动完成。

您还可以通过添加构造函数来稍微简化代码:

bnode::bnode(int v)
    : num(v),
      L(nullptr),
      R(nullptr)
{

}

并且由于您已经处理了空参数的情况,因此您不需要空子参数的特殊情况:

bnode* binsert(bnode *h,int k)
{
    if(h == nullptr)
    {
        h = new bnode(k);
    }
    else if(k < h->num)
    {
        h->L = binsert(h->L, k);
    }
    else if(k > h->num)
    {
        h->R = binsert(h->R, k);
    }
    return h;
}