0

複雑なツリー構造Tを操作し、2つのコンポーネントツリー構造AとBを返す関数get_trees()があります。これを機能させる唯一の方法は、AとBへのポインターを使用して新しい構造Cを作成することです。 、これはパラメータとして関数に渡され、戻り値でもあります。

typedef struct Composite {
itree *A;
itree *B; 
} composite;

composite *get_trees(complextree *T, itree *A, itree *B, composite *C);

ツリーAおよびBのルートノードは、別の関数で初期化されます。

itree *A = new_itree(0);
itree *B = new_itree(0);
A->n     = T->a;
B->n     = T->b;
composite *C;
C = get_trees(T, A, B, C);

get_trees()は、complextree Tのブランチをウォークダウンし、AとBのノードを割り当ててデータを設定し、サブオードで再帰的に呼び出します。簡略化されたコード:

//code for allocating subnodes of A and B     
if (T->nodes != NULL){
    for (i=0; i< T->nn; i++){
    //code for computing p & q
    C = get_trees(T->nodes[i], A->nodes[p], B->nodes[q]);
    }
}

コードは正常に機能します。しかし、それは非常に醜いようです。

(1)Cには本質的な意味はなく、複数の値を返すために使用されます。代替手段はありますか?次の線に沿った何か:

(2)次のシグネチャで再帰関数を書くことは可能ですか?

void get_trees(T, A, B);

パラメータとしてAとBのルートノードを渡し、サブノードが再帰関数内に割り当てられている場合、いわばコマンドの連続チェーンがあり、再帰呼び出しが完了するとツリー全体が使用可能になるはずです。それは私にとってはうまくいきませんでした、それでそれは許されてはいけません。誰かがそれが事実である理由を説明できれば、またはよりエレガントな解決策が可能であるならば、私は感謝しますか?

おかげで、幸せな休日。〜RT

4

3 に答える 3

1

あなたが行ったことは、関数の戻り値として複数のポインター値を返す唯一の方法です。しかし、それは良い形とは見なされません。

適切な形式は、関数に out パラメーターと in パラメーターがあり、戻り値を使用して成功または失敗を示すことを宣言することです。このような

bool get_trees(complextree *T, itree *A, itree *B, composite *C, itree ** AOut, itree** BOut); 
于 2009-12-27T01:10:15.260 に答える
0

これは、質問のより簡単なバージョンです。次のノードがあるとします。

typedef struct Node {
    int n; // number of sub-nodes
    int i; // data
    node  **nodes;//subnodes
} node;

次のコードは、データ値を 2 倍にして (エラー チェックなしで) ツリー構造を複製します。

node *double_tree( node *A, node *B ) {
  if ( B == NULL ) {
    B = (node*) calloc( 1, sizeof (node ) );
  }
  B->i = 2 * A->i;
  B->n = A->n;
  if ( A->nodes != NULL ) {
    B->nodes = (node **) calloc( 1, A->n * sizeof (node* ) );
    int ii;
    for ( ii = 0; ii < A->n; ii++ ) {
        B->nodes[ii] = double_tree( A->nodes[ii], B->nodes[ii] );
    }
  }
  return B;
}

私の元の問題には2つのバリエーションが含まれていました。

(a) 複数のリターン ツリーがありました (double_tree、square_tree など)。

(b) リターン ツリーの構造が入力ツリーと異なっていた。

核心的な問題は、「関数内に割り当てられた構造体は、ポインターとして関数出力として「返される」必要があることのようです。ポインターをパラメーターとして渡すだけではうまくいきません。私が間違っていることを願っており、これを行うためのより良い方法があることを願っています。

助けてくれてありがとう、ラス

于 2009-12-27T14:39:11.363 に答える
0

ええ、呼び出し元のコンポジットへのポインターを渡すと、関数はそれを使用して結果を保存できます。もちろん、スタックまたはヒープ上で最初に複合オブジェクトを作成することが重要です...

   composite c;
   get_trees(&c);

   composite *c = malloc...
   get_trees(c)

もちろん、関数は呼び出し元にコピーされる構造体を実際に返すことができますが、そのスタイルは限られた場合にのみ使用します...

于 2009-12-27T01:12:23.527 に答える