請問,這個程序的二叉樹遍歷為什么有錯


#include <stdio.h>
#include <malloc.h>
typedef struct btnode
{
int data;
struct btnode *lchild,*rchild;
}BTONDE;
void createbintree(BTONDE *t)
{
int data;
scanf("%d",&data);
if(data==0)
{
t=NULL;
}
else
{
t=(BTONDE *)malloc(sizeof(BTONDE));
t->data=data;
createbintree(t->lchild);
createbintree(t->rchild);
}
}
void prerodrdet(BTONDE *t)
{
if(t)
{
printf("%d",t->data);
prerodrdet(t->lchild);
prerodrdet(t->rchild);
}
}
int main(void)
{
BTONDE t1;
BTONDE *t=&t1;
createbintree(t);
printf("the is\n");
prerodrdet(t);
return 0;

7 个解决方案

#1


t1未初始化,后面的指針好像就沒什么意義啊(個人意見,不知道對不對)

先給t1初始化,再
t->lchild=(BTONDE *)malloc(sizeof(BTONDE));
t->rchild=(BTONDE *)malloc(sizeof(BTONDE));

#2


函數傳參方式不對,malloc后的內存如法傳給實參。可以使用二級指針,C++的話可以使用指針的引用!

#3


引用 2 樓  的回復:
函數傳參方式不對,malloc后的內存如法傳給實參。可以使用二級指針,C++的話可以使用指針的引用!


寫錯了,應該是:
函數傳參方式不對,malloc后的內存 無法傳給實參。可以使用二級指針,C++的話可以使用指針的引用!

#4


#include <stdio.h>
#include <malloc.h>
typedef struct btnode
{
    int data;
    struct btnode *lchild,*rchild;
}BTONDE;
void createbintree(BTONDE **t)
{
    int data;
    scanf("%d",&data);
    if(data==0)
    {
        *t=NULL;
    }
    else
    {
        *t=(BTONDE *)malloc(sizeof(BTONDE));
        (*t)->data=data;
        createbintree(&((*t)->lchild));
        createbintree(&((*t)->rchild));
    }
}
void prerodrdet(BTONDE *t)
{
    if(t != NULL)
    {
        printf("%d",t->data);
        prerodrdet(t->lchild);
        prerodrdet(t->rchild);
    }
}
int main(void)
{
    BTONDE t1;
    BTONDE *t=&t1;
    createbintree(&t);
    printf("the is\n");
    prerodrdet(t);
    return 0;
}

#5


引用 4 樓  的回復:
#include <stdio.h>
#include <malloc.h>
typedef struct btnode
{
    int data;
    struct btnode *lchild,*rchild;
}BTONDE;
void createbintree(BTONDE **t)
{
    int data;
    scanf("%d",&amp;d……


為什么需要使用二級指針?

#6


引用 3 樓  的回復:
引用 2 樓  的回復:

函數傳參方式不對,malloc后的內存如法傳給實參。可以使用二級指針,C++的話可以使用指針的引用!


寫錯了,應該是:
函數傳參方式不對,malloc后的內存無法傳給實參。可以使用二級指針,C++的話可以使用指針的引用!


為什么需要使用二級指針?
為什么無法傳遞?動態空間不是跨函數使用嗎?這個函數調用 完他還在!

#7


在主函數里的t假設t指向的是0x18這個地址,那么t既然能存0x18說明它分配到了4個字節的內存空間,這個內存空間存的是0x18這個地址,那么自然這個內存空間也是有地址的 假設是0x50;而當你調用子函數的時候傳過去的其實是0x18這個值,那么這個值也是存在一快4個字節的內存上的,而你子函數里那個新定義的指針t 為0x18,但是這個0x18也是存在內存里的,而它的內存地址肯定不是0x50,假設是0x60。所以當你給t重新賦值為開辟空間的那個地址的時候,其實是0x60這個地址的內存空間里由0x18變成了那塊開辟的空間的地址,而主函數里的0x50這內存空間里的0x18沒有改變。但是當你用二級指針傳參的時候傳的是0x50,然后取*后就是找到了那塊內存空間,然后把那塊內存空間上的0x18改成了新開辟空間的地址,達到了效果。不知道這么說你是否能明白,希望對你有所幫助。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



二叉樹中序非遞歸遍歷問題,請問錯在哪里 鏈式二叉樹遍歷具體程序 二叉樹的基本遍歷程序 二叉樹的遍歷 二叉樹的遍歷 二叉樹的遍歷 二叉樹的遍歷 二叉樹的遍歷 二叉樹的遍歷 二叉樹的遍歷
 
粤ICP备14056181号  © 2014-2020 ITdaan.com