これは、c で再帰関数を作成する初めての試みです。次のコードが機能します。長い投稿で申し訳ありませんが、できるだけ明確にしようとしています。
各ノード (inode) が整数フィールド "n" を持つツリーを生成しようとしています。これに対応して、各 i ノードには、「n」個の他の i ノードへのポインタの配列があります。関数inode *I = gen_tree(inode *I, int nlevels);
は、各レベルで乱数の inode を持つツリーを生成します。ツリーは深さ優先で生成されます。いくつか質問があります。
(a) 関数を書くためのより良い方法はありますか?? フィードバック/提案をいただければ幸いです。
(b) ツリーは BF 形式で生成できますか?
(c)I->i
ツリーがトラバースされるインデックスが必要です。計算する関数を作成するにはどうすればよいI->i
ですか?
(d)I->c
特定のノードの下にあるすべての inode の累積合計が必要です。計算する関数を作成するにはどうすればよいI->c
ですか?
前もって感謝します、
〜ラス
//.h file:
typedef struct integerNode {
int n;
int c;
int i;
struct integerNode **nodes;
} inode;
inode *new_inode( int n );
inode *gen_itree( inode *I, int nlevels );
//Constructor:
inode *new_inode( int n ){
inode *I;
I = malloc( sizeof (inode ) );
I->n = n;
I->nodes = malloc( n * sizeof (inode* ) );
return (I );
};
//Generating tree with random-number of nodes:
inode *gen_itree( inode *I, int nlevels ){
int i, next_level, next_n;
printf( " \n" );
printf( " I : %p\n", I );
printf( " ***** nlevels : %d\n", nlevels );
printf( " *************\n" );
if ( nlevels == 0 ) {
printf( " nlevels == 0!\n");
} else {
printf( " I->n : %d\n", I->n );
printf( " *************\n" );
next_level = nlevels - 1;
for ( i = 0; i < I->n; i++ ) {
printf( " I: %p\n",I);
printf( " adding node number: %d\n", i );
next_n = 0 + rand( ) % 3;
I->nodes[i] = new_inode( next_n );
printf( " I->nodes[%d]->n: %p, %d\n",i, I->nodes[i],next_n);
I->nodes[i] = gen_itree( I->nodes[i], next_level );
}
}
printf( " *************\n" );
printf( " returning I : %p\n", I );//This part is unclear to me!
printf( " *************\n" );
return (I);
}
//Main.c
int main( int argc, char** argv ){
inode *I;
I = new_inode( 2 );
I = gen_itree(I,3);
return ( 1 );
}