2014-03-31 57 views
1

我写了一个应该使用递归来增长'雪花'的方法,它本质上是一棵树。出于某种原因,在调试时,它只向树添加一行,不会超过这一行。我认为它与指针有关,但似乎无法弄清楚它有什么问题。帮助将非常感激。用指针递归-C

int growth(Snowflake * root, Snowflake * parent, Ray * ray){ 
    printf("*\n"); 
    printf("%f\n", root->ray->starting_point); 
    printf("%f\n", ray->angle); 
    if (root->middle != NULL){ 
     printf("Found middle! \n"); 
     growth(root->middle, root, ray); 
    } 
    else if (root->right != NULL){ 
     printf("Found off center!\n"); 
     growth(root->right, root, ray); 
     printf("Found off middle!\n"); 
     growth(root->left, root, ray); 
    } 
    else{ 
     if (parent == NULL){ 
      printf("MY PARENTS ARE DEAD!\n"); 
      parent = root; 
      //root = &parent; 
     } 
     printf("Starting Again!\n"); 
     Snowflake * add = malloc(sizeof(Snowflake)); 
     add->parent = parent; 
     add->middle = NULL; 
     add->right = NULL; 
     add->left = NULL; 
     add->ray = ray; 
     add->ray->starting_point = add->parent->ray->end_point; 
     add->ray->end_point = add->ray->starting_point + 1; 
     printf("%f\n",add->ray->starting_point); 
     printf("%f\n",add->ray->end_point); 
     if (add->ray->angle == 0){ 
      add->parent->middle = add; 
     } 
     else{ 
      add->parent->right = add; 
      add->parent->left = add; 
     } 
     return 1; 
    } 
} 
+4

您是否尝试过使用调试器? – dutt

+1

请缩进你的代码,并提供'Snowflake'和'Ray'类型的定义。 – ajay

+0

@达特,你有没有试过看OP的前两句话? – CiaPan

回答

0

我看到下面的问题与您的代码:

  1. 我看不出有任何的检查,以确保root != NULL
  2. 我不知道你是否使用函数的返回值。有三个函数递归调用,其中没有一个返回。我认为,

    growth(root->middle, root, ray); 
    

    return growth(root->middle, root, ray); 
    
  3. 在此块来替换,

    else if (root->right != NULL){ 
        printf("Found off center!\n"); 
        growth(root->right, root, ray); 
        printf("Found off middle!\n"); 
        growth(root->left, root, ray); 
    } 
    

    你不检查root->left是否NULL。也许你想用的是:

    else if (root->right != NULL){ 
        printf("Found off center!\n"); 
        growth(root->right, root, ray); 
    } 
    else if (root->left != NULL){ 
        printf("Found off middle!\n"); 
        growth(root->left, root, ray); 
    } 
    

    如果你想用第二个代码块,我想补充的return声明对夫妇和其更改为:

    else if (root->right != NULL){ 
        printf("Found off center!\n"); 
        return growth(root->right, root, ray); 
    } 
    else if (root->left != NULL){ 
        printf("Found off middle!\n"); 
        return growth(root->left, root, ray); 
    } 
    
  4. 的代码

    此块
    if (parent == NULL){ 
         printf("MY PARENTS ARE DEAD!\n"); 
         parent = root; 
         //root = &parent; 
        } 
    

    如果root == NULL将会出现问题。我不知道你如何确定这种事情没有发生。

希望这会有所帮助。