Crea ricorsivamente un albero

c++ expression-trees recursion

Domanda

Sto provando a creare ricorsivamente un albero di espressioni. Ogni volta che questa funzione riceve altre variabili di espressione, funziona perfettamente. Ma ogni volta che riceve un intero (o in questo caso una stringa che lo porta alla dichiarazione else) si blocca il mio programma.

     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 è la radice dell'albero (che è nullo quando viene passata a questa funzione) e ins è un oggetto flusso di file di input.

Risposta accettata

Mi dispiace dire che non funziona bene, ci sono più errori

in primo luogo

if(p == NULL && buffer == "*","/","+","-")

dovrebbe essere

if(buffer == "*" || buffer == "/" || buffer == "+" || buffer == "-")

La virgola non funziona come te lo aspetti.

In secondo luogo, se vuoi costruire il tuo albero dovresti restituire un puntatore dalla funzione, non passare un puntatore nella funzione. Come questo

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

Questo sembra essere un malinteso molto comune su come funzionano gli indicatori quando passano a una funzione. Se si passa un puntatore a una funzione, è possibile utilizzarlo per modificare ciò che viene indicato nella funzione di chiamata, non è possibile utilizzarlo per modificare il puntatore stesso nella funzione di chiamata.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché