【问题标题】:C Binary Tree fork depth and widthC二叉树叉深度和宽度
【发布时间】:2022-01-09 08:46:36
【问题描述】:

我正在学习 C 语言,但我被 fork 函数和进程所困。我想创建一个获取 2 个输入(深度和宽度)的 c 程序来创建像 image 中一样的树

这是我现在完成的代码:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include<sys/wait.h>

int
main (int argc, char *argv[])
{
  int i, depth, width, pid, j, pid2;

  if (argc != 3)
    exit (0);

  depth= atoi (argv[1]);
  width = atoi (argv[2]);

  for (i = 0; i < width; i++)
    {
      pid = fork ();
      if (pid < 0)
        {
          printf ("Error");
          exit (1);
        }
          else if (pid == 0)
        {
          for (j = 0; j < depth; j++)
            {
              pid2 = fork ();
              if (pid2 < 0)
                {
                  printf ("Error");
                  exit (1);
                }
                  else if (pid2 == 0)
                {
                  printf ("Child (%d): %d\n", j + 1, getpid ());
                  exit (0);
                }
                  else
                {
                  wait (NULL);
                }
            }
        }
          else
        {
          wait (NULL);
        }
    }

  printf ("Child %d and parent %d\n", getpid (), getppid ());
  sleep (1);
  return 0;
}

【问题讨论】:

  • 一棵宽度为 3 或 4 的树长什么样子?还是宽度只有 2?
  • 如果您没有在错误的地方拨打您的wait() 电话,我确实会感到惊讶。让我们这样说吧——我对他们深表怀疑。
  • @JonathanLeffler 恕我直言,他们的 wait() 还可以,除了他们有两个,因为他们使用两个 for 循环而不是一个。

标签: c tree fork


【解决方案1】:

您的帖子并没有真正包含问题,所以我假设问题是,我尝试运行我的代码,为什么它无法生成预期的“树”。由于您正在学习 C,我假设您不想要确切的代码,而是想要了解“为什么它不起作用”。

首先,您的图片不代表宽度为 2 深度为 3 的树。您的图片仅显示宽度为 2 的树的一部分,而不是整棵树,我不清楚您是否理解深度是,要么。先了解这些东西。

在您了解树之后,您就可以使用单个进程来实现树了(暂时忘记fork)。对于树的每个节点,不要分叉一个进程,只需打印一些东西,这样您就可以看到您拥有所有您期望的节点。

您无法实现具有 2 个嵌套循环的树,一个用于宽度,一个用于深度。您可以使用for 循环来获取宽度,但您必须使用递归来获取深度。递归函数有深度作为参数,当你再次调用它时,你递减深度。

好的,一旦你弄清楚了,那么你就可以添加分叉了。您会注意到多个进程会使事情变得更加困难!

哦,请确保您的代码正确缩进。它会帮助你理解事物。

【讨论】:

  • 如果对我的答案投反对票的人可以发表评论并解释他们这样做的原因,这可能会帮助我改进我的答案。我没有特意加入任何C代码,而是提供了详细的解释,以帮助发布者,因为他们只是学习C。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-12
  • 1970-01-01
  • 2016-01-24
  • 2012-10-12
  • 2014-08-07
相关资源
最近更新 更多