Я пытаюсь рекурсивно создать дерево выражений. Всякий раз, когда эта функция получает другие переменные выражения, она работает отлично. Но всякий раз, когда он получает целое число (или в этом случае строку, которое принимает его в оператор else), он вызывает сбой моей программы.
void buildExpressionTree (istream &ins, BinaryNode* p)
{
string buffer;
//read in from file
while ((ins.peek()!='\n') && (ins >> buffer))
{
if(p == NULL && buffer == "*","/","+","-")
{
p = new BinaryNode(buffer, NULL, NULL);
buildExpressionTree(ins,p->left);
buildExpressionTree(ins,p->right);
}
else
{
p = new BinaryNode(buffer, NULL, NULL);
}
}
}
p - корень дерева (который является null при передаче этой функции), а ins - это объект потока входных файлов.
Извините, что он не работает нормально, есть несколько ошибок
в первую очередь
if(p == NULL && buffer == "*","/","+","-")
должно быть
if(buffer == "*" || buffer == "/" || buffer == "+" || buffer == "-")
Запятая не работает, как вы ожидаете.
Во-вторых, если вы хотите создать свое дерево, вы должны вернуть указатель из функции, а не передать указатель на функцию. Как это
BinaryNode* buildExpressionTree (istream &ins)
{
string buffer;
//read in from file
BinaryNode* p = NULL;
while ((ins.peek()!='\n') && (ins >> buffer))
{
if(buffer == "*" || buffer == "/" || buffer == "+" || buffer == "-")
{
p = new BinaryNode(buffer, NULL, NULL);
p->left = buildExpressionTree(ins);
p->right = buildExpressionTree(ins);
}
else
{
p = new BinaryNode(buffer, NULL, NULL);
}
}
return p;
}
Это, по-видимому, очень распространенное непонимание того, как работают указатели при передаче функции. Если вы передадите указатель на функцию, вы можете использовать ее для изменения того, на что указывает вызывающая функция, вы не можете использовать ее для изменения самого указателя в вызывающей функции.