2016-04-10 16 views
0

我正在研究涉及使用二元搜索树的程序,并且我试图初始化BST。但我有一个很难理解为什么我们使用两个结构,以及为什么我收到“请求成员留下的东西不是一个结构或联合”难以理解我们为什么使用以及如何使用二元搜索树的两个结构体

#include <stdio.h> 
#include <stdlib.h> 
#define ADD_LENGTH 30 



typedef struct treeType{ 
    int listingId, price, propertySize; 
    int numOfBeds, yearBult; 
    char agent[20]; 
    char address[ADD_LENGTH]; 
    struct treeType *left; 
    struct treeType *right; 

}bNode; 

typedef struct treeFrame{ 
    bNode *node; 

}bTree; 
void init(bTree **tree); 


int main(void) 
{ 
    bTree *tree; 
    init(&tree); 

    return 0; 
} 

void init(bTree **tree){ 
    tree = NULL; 
    tree->left = NULL; 
    tree->node->right = NULL; 


} 
+2

'无效的init(B树**树){ \t *树=的malloc(的sizeof(**树)); \t(* tree) - > node = malloc(sizeof(bNode)); \t(* tree) - > node-> left = NULL; \t(* tree) - > node-> right = NULL; }' – BLUEPIXY

+0

在'tree-> left = NULL;'你缺少'node->'。 –

回答

1

但我有一个困难时期理解为什么我们使用两种结构

你正在处理两个抽象 - 树和树的节点。使用两个struct s很合理,每个抽象一个。

您发布的struct为树,bTree,只有一个成员,即根节点。您可以添加其他成员 - 树中节点的数量,树中叶节点的最大深度等等。承认可以计算这些成员,但将它们作为成员变量并更新可能会有用当你修改树使它们可用而不需要支付遍历树的代价。

要记住的主要事情是树和树的节点是两个不同的抽象。他们使用两个不同的struct定义。根据应用程序的需要,每个可以独立扩展/更新。

为什么我收到“请求成员留下的东西不是一个结构或联合”的功能init

编码是错误的原因有几个。

  1. 您还没有为“树”分配任何内存。
  2. 您正在正确使用变量tree。在函数中,tree的类型为bTree**。它是指向bTree的指针。
  3. bTree没有会员left。因此,您尝试使用tree->left = NULL;是不正确的。

你需要的是这样的:

void init(bTree **tree) 
{ 
    // Allocate memory for the tree. 
    *tree = malloc(sizeof(bTree)); 

    // Make the root node NULL to indicate it is an empty tree. 
    (*tree)->node = NULL; 
} 
+0

通过抽象,这是什么意思? 如果我想检查根是否为NULL,应该将根设置为初始化函数,还应该将*树设置为NULL? – Jude

+1

请参阅https://en.wikipedia.org/wiki/Abstraction_%28computer_science%29以了解含义抽象。查看更新的'init'函数。 –

相关问题