【问题标题】:Recursion with pointers -C使用指针递归 -C
【发布时间】:2014-05-10 16:41:32
【问题描述】:

我写了一个方法,它应该使用递归来生长一个“雪花”,它本质上是一棵树。出于某种原因,在调试时,它只在树中添加了一行,并且不会更进一步。我认为它与指针有关,但似乎无法弄清楚它有什么问题。非常感谢您的帮助。

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

【问题讨论】:

  • 你试过使用调试器吗?
  • 请缩进您的代码并提供SnowflakeRay类型的定义。
  • @Dutt,你有没有试过读OP的前两句话...?
  • 如果程序在调试器下的行为不同并且独立运行,这通常是由未初始化的变量引起的 - DEBUG版本可能以稍微不同的方式分配变量。此外,内存分配器可能会在调试版本中使用某种模式填充取消分配的块,因此如果您使用指向已释放内存的指针,您可能会在应用程序的发布和调试版本中获得不同的行为。

标签: c pointers recursion tree


【解决方案1】:

我发现您的代码存在以下问题:

  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 将会有问题。我不知道您如何确定这不会发生。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2018-05-01
    • 1970-01-01
    • 2023-04-09
    • 2021-05-10
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    相关资源
    最近更新 更多