1

この BST では、searchbst 関数は完全に検索していますが、この関数は常に 0 を返しています。私がそうするようにプログラムしたので、5または8を与えていません。この問題が原因であるコードのエラーは何ですか

#include<iostream>
using namespace std;

struct bstnode{
bstnode *lchild;
int data;
bstnode *rchild;    
};

void creatbst(bstnode *&T,int k){
    if(T=='\0'){
        T=new(bstnode);
        T->data=k;
        T->lchild='\0';
        T->rchild='\0';
    }
    else if(k<T->data){
        creatbst(T->lchild,k);
    }
    else if(k>T->data){
        creatbst(T->rchild,k);
    }
}

int searchbst(bstnode *T,int k){
    if(T=='\0')
    return 5;
    else{

     if(k<T->data)
    searchbst(T->lchild,k); 

    else if(k>T->data)
    searchbst(T->rchild,k); 

    else
        return 8;
    }
}

int main(){
    bstnode *T;
    T='\0';
    creatbst(T,36);
    creatbst(T,20);
    creatbst(T,75);
    creatbst(T,42);
    creatbst(T,8);
    creatbst(T,31);
    creatbst(T,25);
    creatbst(T,3);
    creatbst(T,80);

    cout<<endl<<"searching for ";
    cout<<searchbst(T,3);
    cout<<endl<<"searching for ";
    cout<<searchbst(T,1);
    return 0;

}
4

2 に答える 2

1

再帰呼び出しの戻り値を使用していません。

交換:

if(k<T->data)
  searchbst(T->lchild,k); 
else if(k>T->data)
  searchbst(T->rchild,k); 
else
  return 8;

と:

if(k < T->data)
  return searchbst(T->lchild, k);
else if(k > T->data)
  return searchbst(T->rchild, k);
else
  return 8;
于 2013-08-26T13:42:38.903 に答える
0

return 5;あなたのコードは未定義の動作をしている可能性が高いです:またはreturn 8;ステートメントにつながる条件に従わない場合は、 を呼び出しsearchbst()、その結果を無視し、最終的には関数から外れます。おそらく次の結果を返すつもりでしたsearchbst():

return searchbst(T->rchild, k);

ところで、ヌル ポインター定数を記述する面白い方法があります。'\0'機能しますが、従来の方法は0orを使用することですnullptr(後者は C++11 の方法です)。

于 2013-08-26T13:43:50.687 に答える