Поиск в ширину на бинарном дереве - PullRequest
2 голосов
/ 22 декабря 2011

Я пытаюсь пройтись по двоичному дереву, чтобы найти чей-либо идентификатор, используя его / ее идентификационный номер. Когда я отлаживаю эту функцию, она работает хорошо, но, с другой стороны, когда я запускаю напрямую, она завершается сама собой .. Может кто-нибудь разобраться, пожалуйста?

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);

}

1 Ответ

1 голос
/ 22 декабря 2011
char *temp;
temp=strncpy(temp,q.front()->ID,8);

Вы копируете данные в неинициализированный указатель, поведение которого не определено. Вам необходимо объявить temp как массив или выделить его динамически. Поскольку вы копируете только до 8 байтов, достаточно использовать char temp[9];. Обратите внимание, что strncpy оставит строку без изменений, если ввод был слишком длинным, поэтому вам нужно добавить temp[8]=0;, чтобы быть в безопасности.

Нет смысла присваивать результат strncpy обратно temp, поскольку он просто возвращает свой первый аргумент.

Гораздо лучше поступить так, как в C ++: используйте std::string и избегайте всего этого, связанного с char указателями и нулевыми ограничителями.

...