0

式ツリーを再帰的に作成しようとしています。この関数が他の式変数を受け取るたびに、完全に正常に実行されます。しかし、整数(またはこの場合はそれを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 は入力ファイル ストリーム オブジェクトです。

4

1 に答える 1

1

複数のエラーがあり、正常に動作していないと言って申し訳ありません

まずは

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

これは、関数に渡されたときにポインターがどのように機能するかについて、非常によくある誤解のようです。関数にポインターを渡すと、それを使用して呼び出し元の関数で指されているものを変更できますが、呼び出し元の関数でポインター自体を変更するために使用することはできません。

于 2013-10-09T09:05:10.707 に答える