【问题标题】:Creating a Tree recursively递归创建树
【发布时间】:2014-10-22 12:20:07
【问题描述】:

我正在尝试在 C 中递归地创建一棵树。

到目前为止,我已经完成了下面的代码。但是在编译时我得到以下错误消息;

错误:在不是结构或联合的东西中请求成员“esq” MakeTree(H-1, p->left, p); ^ 错误:在不是结构或联合的东西中请求成员“dir” MakeTree(H-1, p->right, p); ^

我做错了什么?

#include <stdio.h>
#include <stdlib.h>

typedef struct nohh {
  int info;
  struct nohh *left;
  struct nohh *right;
  struct nohh *up;
} nohh, *noh;

void MakeTree(int H, noh *p, noh *u);

int main(){
  noh p = NULL;
  int h;

  printf("What is the Tree height? ");
  scanf("%d\n", &h);

  MakeTree(h, &p, &p);

  return 0;
}

void MakeTree(int H, noh *p, noh *u){

  while(H>=0){
    p = malloc(sizeof(noh));
    (*p)->up = *u;
    MakeTree(H-1, p->left, p);
    MakeTree(H-1, p->right, p);
  }
}

谢谢。

【问题讨论】:

  • noh 是指向struct nohh 的指针。
  • 请完成翻译,然后重新编译并发布错误和代码。
  • p-&gt;left 应该是 &amp;(*p)-&gt;left。你对malloc 的使用也是错误的。
  • 因为 noh 是一个指针,所以你想为结构分配空间,所以*p = malloc(sizeof(nohh)); 应该是正确的。
  • @Anton.P @Anton.P p in MakeTree 是一个指向结构的指针,所以你必须取消引用两次然后你想要成员的地址 => &amp;(*p)-&gt;left

标签: c tree


【解决方案1】:
void MakeTree(int H, noh *p, noh *u)
{
  if (H>0)
  {
    *p = malloc(sizeof(nohh));
    (*p)->up = *u;
    MakeTree(H-1, &(*p)->left, p);
    MakeTree(H-1, &(*p)->right, p);
  }
}

这应该可以解决您的问题:

你想要递归,所以你不需要 while 循环。 您想 malloc 结构的大小而不是指针的大小,并将其写入 main 中原始 p 的位置。 MakeTree 中的p 是指向结构体的指针,因此您必须取消引用两次,然后您需要成员的地址 => &amp;(*p)-&gt;left&amp;(*p)-&gt;right

一个建议:不要调用结构 nohh 和指向它的指针 noh,这是不可读的。

【讨论】:

    【解决方案2】:

    这个解决方案在避免指向指针的情况下更具可读性。

    struct nohh {
      int info;
      struct nohh *left;
      struct nohh *right;
      struct nohh *up;
    } ;
    
    struct nohh *MakeTree(int h, struct nohh *up)
    {
      if (h >= 0)
      {
        struct nohh *p = (struct nohh *)malloc(sizeof(struct nohh));
        p->up = up;
        p->left  = MakeTree(h - 1, p);
        p->right = MakeTree(h - 1, p);
        return p ;
      }
    
      return NULL ;
    }
    
    
    int main(){
      struct nohh *p ;
      int h;
    
      printf("What is the Tree height? ");
      scanf("%d", &h);
    
      p = MakeTree(h, NULL);
    
      return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      • 2011-05-08
      • 2015-03-18
      • 2017-09-21
      • 2012-08-23
      相关资源
      最近更新 更多