结构名称是指针吗?

时间:2013-08-31 22:54:52

标签: c struct tree binary-tree

typedef struct _Tree{
    int val;
    struct _Tree *left;
    struct _Tree *right;
}Tree;

这里是Tree指针吗?它是否指向val的地址?

如果我定义Tree *node怎么样? node指针指向Tree的地址吗?

如果我们要插入val,我们应该使用insert(&node)还是insert(node)

void insert_Tree(Tree **root, int key){
if((*root) == NULL){
    (*root) = (Tree *)malloc(sizeof(Tree));
    (*root)->val = key;
    (*root)->left = NULL;
    (*root)->right = NULL;
    cout<<"insert data "<<key<<endl;
}else if(key< (*root)->val){
    insert_Tree(&(*root)->left, key);
    cout<<"go left"<<endl;
}else{
    insert_Tree(&(*root)->right, key);
    cout<<"go right"<<endl;
}
}
int main(){

Tree *root = NULL;
insert_Tree(&root, 10);
insert_Tree(&root, 20);
insert_Tree(&root, 5);
insert_Tree(&root, 100);
}

4 个答案:

答案 0 :(得分:5)

Tree不是指针。它是用户定义类型struct _Tree别名。因此,当您声明一个新变量时,而不是键入

struct _Tree foo;

您只需输入

即可
Tree foo;

这两个是等价的。

如果您声明

Tree *node;

C中的一元*运算符是取消引用/间接运算符,因此您所说的是:*nodenode的解除引用值,是{{1 }}。或者换句话说,Tree是指向node的指针,即指向Tree的指针。

在您为其分配内存之前,此指针未初始化:

struct _Tree

在分配此内存之前,指针指向某个未定义的位置。分配内存后,您可以将node = malloc (sizeof (Tree)); 插入节点,如下所示:

val

如何将此node->val = val; 本身插入二叉树是一个有趣的问题。你有什么尝试?

答案 1 :(得分:3)

不,Tree根本不是指针或任何变量,它是typedef的{​​{1}}别名,可以与之互换使用。

如果您声明struct _Tree,则您已声明指向Tree *node结构的指针,但本身没有实际结构。

如果没有更多代码,您Tree函数的工作原理很难说。

答案 2 :(得分:0)

以下是定义此简单结构的更常用方法:

typedef struct{
    int val;
    Tree *left;
    Tree *right;
}Tree;

使用此结构通常如下所示:

Tree top;
Tree left;
Tree right;

top.val = 0;
top.left = &left;
top.right = &right;        

如您所见,Tree不是此处的指针,而是类型结构定义。它就像一个类型,这意味着你可以用Tree类型实例化一个变量。此外,您需要使用引用符号(&amp;)来分配左右树指针,因为结构成员(左侧和右侧)是指向Tree的指针。

答案 3 :(得分:0)

Tree是由您自己的代码定义的数据类型。请注意您在代码中如何调用它,它与intdouble可能位于同一位置。

由于它是一种数据类型,因此您也可以将其定义为指针:

  Tree *root;

root是指向结构/数据类型“Tree”的指针。 root只有4个字节,分配树结构。

Or Tree可以是一组结构化/格式化的存储位置:

 Tree  node;

node是结构树,并分配了实际的存储位置。如果需要传递节点的地址,请指定:&node,这会在“节点”处创建指向存储位置的指针。

我认为您的其他问题取决于对Tree数据类型的理解。

通常,当您从编程开始时,您不需要定义双指针,例如Tree **root,因此请重新检查您的代码并简化它。

希望这有帮助。