c - 带指针的递归 -C

标签 c pointers recursion tree

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

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

最佳答案

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

  1. 我没有看到任何检查来确保 root != NULL
  2. 不知道你是不是在用函数的返回值。对该函数进行了 3 次递归调用,但均未返回。我认为,

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

    应该替换为

    return growth(root->middle, root, ray);
    
  3. 在这个 block 中,

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

希望这对您有所帮助。

关于c - 带指针的递归 -C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22759938/

相关文章:

php - 使用 mysql/php 中的 id/parent_id 模型获取记录的所有父项的最简单方法是什么?

python - 根据端点递归划分列表

java - BST insert(root, value) 递归方法

c++ - 当线程/进程处于 sleep 状态时, sleep 线程或进程的指令是否继续执行?

c - 如何在 C 中创建一个带指针的池?

c - 如何提高以下代码的性能?

c++ - 在没有 typedef 的情况下使用时显示编译错误的函数的 volatile 指针;需要帮助 w/"void (* volatile userFunc)(void)"

c++ - 为什么我可以在不包含 STL 的情况下使用 nullptr?

c - 向数组添加元素,随机数结果

c - 在 C 中比较字符串时,fgets 比 scanf 更有效吗?