首页 新闻 赞助 找找看

初始化一棵树遇到问题

0
[已解决问题] 解决于 2015-05-27 23:17
typedef struct Tree *tree;
struct Tree{
    int node;
    tree leftTree;
    tree rightTree;
};
void initial(tree a){
    a = (Tree*)malloc(sizeof(Tree));
    a->leftTree = NULL;
    a->rightTree = NULL;
}
// 为什么函数带一个返回值就对了,操作的是指针,不返回不也就可以吗

tree initial(tree a){
  a = (Tree*)malloc(sizeof(Tree));
  a->leftTree = NULL;
  a->rightTree = NULL;
  return a;
}



initial()函数为什么是错的,函数的形参不是一个指针吗

ithan的主页 ithan | 菜鸟二级 | 园豆:234
提问于:2015-05-27 20:42
< >
分享
最佳答案
0

应该这样写:

void initial(tree *a)

{ a = (Tree*)malloc(sizeof(Tree));

a->leftTree = NULL;

a->rightTree = NULL;

}

奖励园豆:5
[0] | 小虾三级 |园豆:1257 | 2015-05-27 21:14

tree 已经是一个指针类型了啊

ithan | 园豆:234 (菜鸟二级) | 2015-05-27 21:21

@ithan: 

typedef struct treeNode{
    int node;
    struct treeNode *leftTree;
    struct treeNode *rightTree;
} treeNode,*tree;

这样定义

[0] | 园豆:1257 (小虾三级) | 2015-05-27 21:32

@千紫小星: 

#include <stdio.h>

typedef struct treeNode{
    int node;
    struct treeNode *leftTree;
    struct treeNode *rightTree;
} treeNode,*tree;

void initial(tree a){
    a = (treeNode *)malloc(sizeof(treeNode));
    a->leftTree = NULL;
    a->rightTree = NULL;
}

int main(void)
{
    tree a;
    initial(a);
    printf("Hello World!\n");
    return 0;
}

这样来写

[0] | 园豆:1257 (小虾三级) | 2015-05-27 21:34

@千紫小星: 

#include <stdio.h>
#include <stdlib.h>
typedef struct treeNode{
    int node;
    struct treeNode *leftTree;
    struct treeNode *rightTree;
} treeNode,*tree;

void initial(tree a){
    a = (treeNode *)malloc(sizeof(treeNode));
    a->leftTree = NULL;
    a->rightTree = NULL;
}

int main(void)
{
    tree a;
    initial(a);
    //访问左儿子会出问题 
    initial(a->leftTree);
    a->leftTree->node = 5;
    printf("%d\n", a->leftTree->node);
    printf("Hello World!\n");
    return 0;
}

如果访问左儿子就会出问题,如果像这样写就不会出问题,给initial()函数一个返回值

#include <stdio.h>
#include <stdlib.h>
typedef struct treeNode{
    int node;
    struct treeNode *leftTree;
    struct treeNode *rightTree;
} treeNode,*tree;

tree initial(){
    tree a;
    a = (treeNode *)malloc(sizeof(treeNode));
    a->leftTree = NULL;
    a->rightTree = NULL;
    return a;
}

int main(void)
{
    tree a;
    a = initial();
    a->leftTree = initial();
    a->leftTree->node = 5;
    printf("%d\n", a->leftTree->node);
    printf("Hello World!\n");
    return 0;
}
ithan | 园豆:234 (菜鸟二级) | 2015-05-27 22:24

@ithan: 这牵涉到指针变量指针的区别,指针变量和普通的数据变量一样,在你出错的程序那里,你往函数里传递的是指针变量,这样就产生了函数传递过程中,实参和形参的问题,子函数里面的形参的指针变量的数值改变了,但是主函数里的没有改变。而你正确的那个程序,因为使用了返回值,和普通的一样。

[0] | 园豆:1257 (小虾三级) | 2015-05-27 22:50

@ithan: 再看看这个图:

[0] | 园豆:1257 (小虾三级) | 2015-05-27 22:54

@ithan: 指针变量就是普通的变量,而指针(地址)是一个变量的地址,指针变量也是有地址的。这东西确实不好理解。

[0] | 园豆:1257 (小虾三级) | 2015-05-27 22:57

@千紫小星: 这下终于懂了!太感动了

ithan | 园豆:234 (菜鸟二级) | 2015-05-27 23:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册