2011-12-22 10 views
2

ID番号を使用して、他のユーザーのIDを見つけるためにバイナリツリーを走査しようとしています。私はこの関数をデバッグするとうまくいくが、逆に直接実行すると終了する。誰かがそれを理解できますか?Breadth Firstバイナリツリーでの検索

struct person{ 
char ID[15]; 
char name[30] ; 
char surname[30]; 
person *left; 
person *right; 
}; 

struct tree{ 
person *root; 
void bfsSearch(); 
void BFS(person*,char*); 
}; 

void tree::BFS(person *root,char *search) 
//BFS traversal on a binary tree 
{ 
    char *temp; 
    std::deque<person *> q; 
    q.push_back(root); 
temp=strncpy(temp,q.front()->ID,8); 
while (q.size() != 0) 
{ 
    person *next = q.front(); 

    if (strcmp(search,temp)==0) 
    { 
     cout<<"Result: "<<q.front()->ID<<endl; 
     break; 
    } 
    q.pop_front(); 

    if (next->left) 
     q.push_back(next->sol); 
    if (next->right) 
     q.push_back(next->sag); 
    temp=strncpy(temp,q.front()->ID,8); 
    } 
} 

void tree::bfsSearch() 
{ 
    person *scan; 
    char *data,*temp; 
    data=new char[15]; 
    scan=root; 
    cout<<"Enter the Person`s ID to search: ";cin>>data; 
    BFS(root,data); 

} 
+0

rootはどこに宣言されていますか? – Pubby

+0

私は更新しました... –

答えて

1
char *temp; 
temp=strncpy(temp,q.front()->ID,8); 

あなたは未定義の動作で初期化されていないポインタ、にデータをコピーしています。 tempを配列として宣言するか、動的に割り当てる必要があります。最大8バイトしかコピーしないので、char temp[9];を使用すると十分です。入力が長すぎる場合、strncpyは文字列を終了しないままにしますので、安全のためにtemp[8]=0;を追加する必要があります。

strncpyの結果をtempに戻すことは、最初の引数を返すだけなので、意味がありません。

C++のやり方ははるかに優れています。std::stringを使用し、ポインタとヌルターミネータでcharを使いこなすのを避けてください。

+0

私はそれを同じようにしました。しかし、奇妙なのは、ルートの右側にあるID番号を検索すると完璧に機能するということです。私はルートの左側を検索しようとするとエラーが発生します –

関連する問題