我正在尝试在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);
}
}
感谢。
答案 0 :(得分:2)
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
是指向struct的指针,所以你必须取消引用两次然后你想要成员的地址=&gt; &(*p)->left
和&(*p)->right
。
一个建议:不要调用结构nohh和指向它的指针noh,这是不可读的。
答案 1 :(得分:1)
这个解决方案更易读,避免指向指针。
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;
}