这是我用c编写递归函数的第一次尝试。以下代码有效。对于冗长的帖子,我深表歉意,但我想尽量保持清楚。

我试图生成一个树,其中每个节点(inode)都有一个整数字段“ n”。相应地,每个索引节点都有一个指向“ n”个其他索引节点的指针数组。函数inode *I = gen_tree(inode *I, int nlevels);生成一个树,该树在每个级别上具有随机数的inode。该树以深度优先的方式生成。我有几个问题。

(a)有没有更好的方法编写函数?任何反馈/建议,将不胜感激。

(b)可以在BF fashon中生成树吗?

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

最佳答案

首先。您没有错误检查。您只编码了自己的幸福道路。
检查您的malloc是否不返回NULL !!!

if (malloc returned NULL){
          free memory
          exit(error_code)
}


然后

 I->nodes[i] = new_inode( next_n );
 I->nodes[i] = gen_itree( I->nodes[i], next_level );


这部分还不清楚。你可以这样做

 I->nodes[i] = gen_itree( new_inode( next_n ), next_level );


这里也一样

I = new_inode( 2 );
I = gen_itree(I,3);


可能

 I = gen_itree(new_inode( 2 ),3);


另外,不要忘记释放分配的内存。

至于(d)

unsigned int get_node_count(inode* i){
    unsigned int counter =0;

    if (!i->nodes) return 0;

     //pseudocode
     for each inode* node in i->nodes{
        counter++
        counter+= get_node_count(node);//accumulate node count in child node
     }

      return counter;

关于c - 构造随机的“整数”树-深度优先/宽度优先,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1564185/

10-11 05:42