香草^巧克力
2020-05-29 13:23
采纳率: 50%
浏览 170

向函数传入一个结构体指针什么时候才不需要返回值?

系统:windows10;编译器:dev c++

写了一个建立二叉树和前序遍历的程序

#include<stdio.h>
#include<stdlib.h>
typedef char datatype;
typedef struct bitnode{
    datatype data;
    struct bitnode *lchlid,*rchlid;
}BitNode;

CreateBitree(BitNode *T){  //建立二叉树
    datatype x;
    printf("输入数据:");
    x=getchar();
    getchar();
    if(x=='#'){   
        T=NULL;
    } 
    else{
        T=(BitNode *)malloc(sizeof(BitNode));
        T->data=x;
        CreateBitree(T->lchlid);
        CreateBitree(T->rchlid);
    }
}

PreorderBitree(BitNode *T){  //前序遍历
    if(T){
        printf("%c",T->data);
        PreorderBitree(T->lchlid);
        PreorderBitree(T->rchlid);
    }
}

int main(){
    BitNode *T=NULL; 
    CreateBitree(T);
    PreorderBitree(T);
    return 0;
}

然后输出结果是这样的:
图片说明

正确结果应该是:ab

然后看了别人的程序之后我改了一下,让建立二叉树的函数有返回值

#include<stdio.h>
#include<stdlib.h>
typedef char datatype;
typedef struct bitnode{
    datatype data;
    struct bitnode *lchlid,*rchlid;
}BitNode;

BitNode* CreateBitree(BitNode *T){  //建立二叉树 
    datatype x;
    printf("输入数据");
    x=getchar();
    getchar();
    if(x=='#'){   
        T=NULL;
        return T;
    } 
    else{
        T=(BitNode *)malloc(sizeof(BitNode));
        T->data=x;
        T->lchlid=CreateBitree(T->lchlid);
        T->rchlid=CreateBitree(T->rchlid);
        return T;
    }
}

PreorderBitree(BitNode *T){  //前序遍历 
    if(T){
        printf("%c",T->data);
        PreorderBitree(T->lchlid);
        PreorderBitree(T->rchlid);
    }
}

int main(){
    BitNode *T=NULL; 
    T=CreateBitree(T);
    PreorderBitree(T);
    return 0;
}

图片说明

就能输出了。

想了半天想不明白,求大佬指点

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • blownewbee 2020-05-29 15:24
    已采纳

    因为
    CreateBitree(BitNode *T)
    这样不能让T修改指向后作用在参数上
    所以必须通过 return T,主程序来改变

    或者你用
    CreateBitree(BitNode& *T)
    就不需要返回值

    点赞 评论

相关推荐 更多相似问题