C++, ошибка stackoverflow

259
30 июня 2017, 07:44

Задание:

Используя очередь и/или стек и подпрограммы, реализующие операции над ними, определить, входит ли элемент Е в двоичное дерево Т. В файле дерево представлено в виде списочной записи.

Выдает ошибку stacoverflow во всех случаях.

Код:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <queue>
using namespace std;
struct btree
{
char elem;
btree * left, *right;
};
btree * build_tree(FILE * in) {
char  sym;
btree *d;
fscanf(in,"%c", &sym);
switch (sym) { 
case '(': 
    { d = new btree;
    fscanf(in,"%c", &sym);  
    d->elem = sym;
    d->left = build_tree(in);
    d->right = build_tree(in);
    fscanf(in,"%c", &sym);
    return d;  
    }
case  '0':  
    return NULL;
case  ',': 
    d = build_tree(in);
    return d; 
default:
    return build_tree(in);
} 
}
bool find_print(btree * d, char E)
{
bool answer = false;
queue<btree*> Q;
if (d != NULL) 
{ Q.push(d);
    do 
    {
        d = Q.front();
        if (d->elem == E)
            answer = true;
        if (d->left != NULL)
            Q.push(d->left);
        if (d->right != NULL) 
            Q.push(d->right);
        Q.pop();
    } while (!Q.empty()&&!answer);
}
return answer;
}
int main()
{
FILE * in = fopen("input.txt", "r");
btree * T = build_tree(in);
system("pause");
system("cls");
char E;
printf("ENTER ELEM\n");
scanf("%c", &E);
bool answer = find_print(T,E);
printf("%s\n", answer ? "true" : "false");
system("pause");
fclose(in);
return 404;
}
Answer 1

Навскидку, я не вижу у вас в коде проверки на успешность чтения символа/возникновение ситуации "конец файла". Если в силу каких-то причин сочетание логики программы и содержимого входного файла приведет к попыткам чтения после конца файла (например, если во входном файле содержится мало-мальская ошибка, делающая его несовместимым с логикой программы), то ваша рекурсивная функция будет безуспешно пытаться читать символы из файла и скорее всего всякий раз переходить на метку default: в вашем switch. Что, очевидно, приведет к бесконечной рекурсии.

Добавьте в ваш код проверки на правильность содержимого входного файла, в том числе на неожиданное достижение его конца, и, я уверен, сразу станет ясно, в чем дело. Например, замыкающий fscanf в обработке ветки case '(':, как я догадываюсь, должен читать символ ')'. Это надо проверять, хотя бы через assert.

READ ALSO
Как склеить строку и вывод функциии length?

Как склеить строку и вывод функциии length?

На с++ не могу понять как можно склеить строку сущность std::string с выводом функции length от другой переменной

267
Как поймать событие epoll connect в неблокированном режиме?

Как поймать событие epoll connect в неблокированном режиме?

Под windows я отлавливал событие FD_CONNECTЗдесь такого, почему то, не нашёл

203
Выбор между .load и $.get

Выбор между .load и $.get

На странице есть меню с кнопками, при нажатии на которые должен подгружаться контент из php-файлов и вставляться в соответствующие дивыСтраница...

258