| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 484 人关注过本帖
标题:二叉树输出不了啊
只看楼主 加入收藏
列车永不停息
Rank: 2
等 级:论坛游民
帖 子:76
专家分:48
注 册:2015-7-31
结帖率:90.91%
收藏
已结贴  问题点数:20 回复次数:6 
二叉树输出不了啊
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include <string.h>

struct Tree 
{
    int a;
    struct Tree *lchild;
    struct Tree *rchild;
}*p,*head;

int GetFree(struct pTree *);
int PlayFree(struct Tree *p);

void main ()
{
        head=(struct Tree*)malloc(sizeof(struct Tree));
    head=p;
    GetFree(p);
    p=head;
    PlayFree(p);
}


int GetFree(struct Tree *p)
{
    char a,b;
    printf("输入根节点:此根节点为空请输入‘#‘符!");
    scanf("%c",&a);getchar();
    if(a=='#')
    {
        p=NULL;
    }
    else
    {
        p=(struct Tree*)malloc(sizeof(struct Tree));
        p->a=a;
        printf("此根节点是否要有左子树?有的话请输入'+',没有请输入'-',输入其他字符则结束程序!");
        scanf("%c",&b);getchar();
        if(b=='+')
        {
           GetFree(p->lchild);//构建左树
        }
        else if(b=='-')
        {
            p->lchild=NULL;
        }
        else
        {
           return 0;
        }
        printf("此根节点是否要有右子树?有的话请输入'+',没有请输入'-',输入其他字符则结束程序!");
        scanf("%c",&b);getchar();
        if(b=='+')
        { 
           GetFree(p->rchild);//构建左树
        }
        else if(b=='-')
        {
            p->rchild=NULL;
        }
        else
        {
            return 0;    
        }
    }
    return 1;
}

int PlayFree(struct Tree *p)//先序遍历
{
    printf("sadasdasdasd");
    if(p!=NULL)
    {
        printf("%c",p->a);
        PlayFree(p->lchild);
        PlayFree(p->rchild);
    }
    return 0;

}


我百度了一下,说要把在函数的参数那加上地址符,但是我加上去之后,却出现一大堆错误,不知道如何去改。
我还有一个疑问,就是指针不就是一个地址吗?为什么还要加地址符?
搜索更多相关主题的帖子: 二叉树 
2015-11-08 11:54
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:0 
int GetFree(struct pTree *);
int PlayFree(struct Tree *p);

剑栈风樯各苦辛,别时冰雪到时春
2015-11-09 15:03
li459461891
Rank: 2
等 级:论坛游民
帖 子:27
专家分:89
注 册:2015-11-5
收藏
得分:20 
问题:
① 正如【林月儿】大神说的,你定义时候多了个P。(2楼)
② head=(struct Tree*)malloc(sizeof(struct Tree)); // 此时head有个初始值,例如:0x00123456
   head=p; // p没有申请地址,所以现在head = p = 0x00000000
   GetFree(p); // 把p的值0x00000000带入函数进行处理,实际上处理的不是全局的p,而是形式参数p。
   p=head;// p = 0x000000?何意义?
   PlayFree(p);// 打印的是0x00000000,肯定崩溃

说明
②中关于GetFree(struct Tree *p),C语言中函数参数都是值拷贝,如果说参数这样写:GetFree(struct Tree *pParam),那么你整个流程只是用了一下p的值0x00000000,开辟空间、赋值处理的却是pParam

解决方案
GetFree传指针,传入p的地址进行计算,也就是指针的指针。

下楼上代码和图片
2015-11-09 17:55
li459461891
Rank: 2
等 级:论坛游民
帖 子:27
专家分:89
注 册:2015-11-5
收藏
得分:0 
兄弟你代码问题不少啊~我没细改,改了关键点

程序代码:
#include<stdio.h>
#include<stdlib.h>
#include <string.h>

struct Tree 
{
    int a;
    struct Tree *lchild;
    struct Tree *rchild;
}*p,*head;

int GetFree(struct Tree **); /* mod */
int PlayFree(struct Tree *p);

void main ()
{
        head=(struct Tree*)malloc(sizeof(struct Tree));
    head=p;
    GetFree(&p);
    // p=head;
    PlayFree(p);
}


int GetFree(struct Tree **p)
{
    char a,b;
    fflush(stdin);/* add */
    printf("输入根节点:此根节点为空请输入‘#‘符!");
    // scanf("%c",&a);getchar();/* del */
    scanf("%c",&a);/* add */
    if(a=='#')
    {
        p=NULL;
    }
    else
    {
        *p=(struct Tree*)malloc(sizeof(struct Tree));
        (*p)->a=a;
        fflush(stdin);/* add */
        printf("此根节点是否要有左子树?有的话请输入'+',没有请输入'-',输入其他字符则结束程序!");
        scanf("%c",&b);getchar();
        if(b=='+')
        {
           GetFree(&((*p)->lchild));//构建左树
        }
        else if(b=='-')
        {
            (*p)->lchild=NULL;
        }
        else
        {
           return 0;
        }
        fflush(stdin);/* add */
        printf("此根节点是否要有右子树?有的话请输入'+',没有请输入'-',输入其他字符则结束程序!");
        // scanf("%c",&b);getchar();/* del */
        scanf("%c",&b);/* add */
        if(b=='+')
        { 
           GetFree(&((*p)->rchild));//构建左树
        }
        else if(b=='-')
        {
            (*p)->rchild=NULL;
        }
        else
        {
            return 0;    
        }
        fflush(stdin);/* add */
    }
    return 1;
}

int PlayFree(struct Tree *p)//先序遍历
{
    // printf("sadasdasdasd"); /* del */
    if(p!=NULL)
    {
        printf("%c",p->a);
        PlayFree(p->lchild);
        PlayFree(p->rchild);
    }
    return 0;

}
2015-11-09 17:57
li459461891
Rank: 2
等 级:论坛游民
帖 子:27
专家分:89
注 册:2015-11-5
收藏
得分:0 
我用VS2010运行如下:

图片附件: 游客没有浏览图片的权限,请 登录注册
2015-11-09 17:57
列车永不停息
Rank: 2
等 级:论坛游民
帖 子:76
专家分:48
注 册:2015-7-31
收藏
得分:0 
回复 5楼 li459461891
兄弟,大恩不言谢,太感激了,这个问题让我苦恼了很久,感谢你这么详细的解答!
2015-11-10 00:29
列车永不停息
Rank: 2
等 级:论坛游民
帖 子:76
专家分:48
注 册:2015-7-31
收藏
得分:0 
回复 5楼 li459461891
真的太感谢了。二级指针代表才是代表地址,我现在才知道。
2015-11-10 00:34
快速回复:二叉树输出不了啊
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038145 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved