#include <stdio.h>
#include <stdlib.h>
typedef struct Btree
{
char data;
struct Btree *lchild,*rchild;
}Btree,*Linklist;
Linklist Create_btree()
{
Linklist L;
char n;
printf("请输入一个值,输入#为结束:\n");
scanf("%s",&n);
L=(Linklist)malloc(sizeof(Btree));
if(n=='#')
{L=NULL;}
else
{
if(!(L=(Linklist)malloc(sizeof(Btree))))
exit(0);
L->data=n;
L->lchild=Create_btree();
L->rchild=Create_btree();
}
return L;
}
void Preorder(Linklist L)
{
if(L==NULL)return;
printf("%s",L->data);
Preorder(L->lchild);
Preorder(L->rchild);
}
void Inorder(Linklist L)
{
if(L==NULL)return;
Inorder(L->lchild);
printf("%s",L->data);
Inorder(L->rchild);
}
void Laorder(Linklist L)
{
if(L==NULL)return;
Laorder(L->lchild);
Laorder(L->rchild);
printf("%s",L->data);
}
int main(void)
{
int x;
Linklist L;
L=(Linklist)malloc(sizeof(Btree));
do{
printf("1...建立二叉树\n");
printf("2...先序遍历\n");
printf("3...中序遍历\n");
printf("4...后序遍历\n");
printf("0...结束\n");
scanf("%d",&x);
switch(x){
case 1:
L=Create_btree();
break;
case 2:
Preorder(L);
printf("\n");
break;
case 3:
Inorder(L);
printf("\n");
break;
case 4:
Laorder(L);
printf("\n");
break;
default :
printf("The End\n");
break;
}
}while(x!=0 && x<=4);
return 0;
}
7 个解决方案
#1
L=Create_btree()函数中返回一个局部变量给L
随着函数调用结束,局部变量所在栈已经被回收了,再到L进行的所有操作都是不确定的,或非法的
随着函数调用结束,局部变量所在栈已经被回收了,再到L进行的所有操作都是不确定的,或非法的
#2
不好意思,看错了
#3
程序可以运行,大概是楼主输入的数据不对,不知楼主你自己知道程序的准确输入是什么不?
printf("%s",L->data); // 这里是%c,
下面的sscanf()里的%s对整个程序来说很特别
printf("请输入一个值,输入#为结束:\n");
scanf("%s",&n); // 这里不知道是你有意为之,我就照着这运行程序,如果改成%c,那么程序有几个地方有加入吸收空格的语句,如getchar(),只是输入比较麻烦。。。
下面是我的测试数据(注意什么时候加#)
1
2 3
# 4 5 #
# # # #
整个输入顺序是 1 2 # 4 ## 3 5 ###
不过程序这样设计输入很麻烦,而且输入字符不是用scanf(%c)的格式,而用%s
觉得在一行完成输入好一点, 如12#4##3 5 ###
printf("%s",L->data); // 这里是%c,
下面的sscanf()里的%s对整个程序来说很特别
printf("请输入一个值,输入#为结束:\n");
scanf("%s",&n); // 这里不知道是你有意为之,我就照着这运行程序,如果改成%c,那么程序有几个地方有加入吸收空格的语句,如getchar(),只是输入比较麻烦。。。
下面是我的测试数据(注意什么时候加#)
1
2 3
# 4 5 #
# # # #
整个输入顺序是 1 2 # 4 ## 3 5 ###
不过程序这样设计输入很麻烦,而且输入字符不是用scanf(%c)的格式,而用%s
觉得在一行完成输入好一点, 如12#4##3 5 ###
#4
幫你調好了
主要是下面的問題:
Linklist Create_btree()
{
Linklist L;
char n[16]; //這裡最好弄個大點的字符數組
printf("请输入一个值,输入#为结束:\n");
scanf("%s",n); //因爲你這裡輸入過多字符,可能發生越界。
//L=(Linklist)malloc(sizeof(Btree)); //這行不需要,否則輸入#時 内存瀉漏。
還有ls提到的 printf("%s",L->data); // 这里是%c,
主要是下面的問題:
Linklist Create_btree()
{
Linklist L;
char n[16]; //這裡最好弄個大點的字符數組
printf("请输入一个值,输入#为结束:\n");
scanf("%s",n); //因爲你這裡輸入過多字符,可能發生越界。
//L=(Linklist)malloc(sizeof(Btree)); //這行不需要,否則輸入#時 内存瀉漏。
還有ls提到的 printf("%s",L->data); // 这里是%c,
#include <stdio.h>
#include <stdlib.h>
typedef struct Btree
{
char data;
struct Btree *lchild,*rchild;
}Btree,*Linklist;
Linklist Create_btree()
{
Linklist L;
char n[16];
printf("请输入一个值,输入#为结束:\n");
scanf("%s",n);
//L=(Linklist)malloc(sizeof(Btree));
if(n[0]=='#')
{L=NULL;}
else
{
if(!(L=(Linklist)malloc(sizeof(Btree))))
exit(0);
L->data=n[0];
L->lchild=Create_btree();
L->rchild=Create_btree();
}
return L;
}
void Preorder(Linklist L)
{
if(L==NULL)return;
printf("%c",L->data);
Preorder(L->lchild);
Preorder(L->rchild);
}
void Inorder(Linklist L)
{
if(L==NULL)return;
Inorder(L->lchild);
printf("%c",L->data);
Inorder(L->rchild);
}
void Laorder(Linklist L)
{
if(L==NULL)return;
Laorder(L->lchild);
Laorder(L->rchild);
printf("%c",L->data);
}
int main(void)
{
int x;
Linklist L;
L=(Linklist)malloc(sizeof(Btree));
do{
printf("1...建立二叉树\n");
printf("2...先序遍历\n");
printf("3...中序遍历\n");
printf("4...后序遍历\n");
printf("0...结束\n");
scanf("%d",&x);
switch(x){
case 1:
L=Create_btree();
break;
case 2:
Preorder(L);
printf("\n");
break;
case 3:
Inorder(L);
printf("\n");
break;
case 4:
Laorder(L);
printf("\n");
break;
default :
printf("The End\n");
break;
}
}while(x!=0 && x<=4);
return 0;
}
#5
int main(void)
{
int x;
Linklist L;
//L=(Linklist)malloc(sizeof(Btree)); //這行也是不需要的
{
int x;
Linklist L;
//L=(Linklist)malloc(sizeof(Btree)); //這行也是不需要的
#6
哦哦,其实我也试过用%c,不过会出现如下结果
如果我想实现一个ab##c##的先序遍历,我的函数应该在哪作出修改呢?
我是个新手,在这问题上实在想不明白,如果是用int作为data类型的话这问题就能比较轻松解决了,不过我想知道字符输入这方面我的不足之处
如果我想实现一个ab##c##的先序遍历,我的函数应该在哪作出修改呢?
我是个新手,在这问题上实在想不明白,如果是用int作为data类型的话这问题就能比较轻松解决了,不过我想知道字符输入这方面我的不足之处
#7
谢谢楼上各位的帮忙~~这问题我已经弄明白了~
#1
L=Create_btree()函数中返回一个局部变量给L
随着函数调用结束,局部变量所在栈已经被回收了,再到L进行的所有操作都是不确定的,或非法的
随着函数调用结束,局部变量所在栈已经被回收了,再到L进行的所有操作都是不确定的,或非法的
#2
不好意思,看错了
#3
程序可以运行,大概是楼主输入的数据不对,不知楼主你自己知道程序的准确输入是什么不?
printf("%s",L->data); // 这里是%c,
下面的sscanf()里的%s对整个程序来说很特别
printf("请输入一个值,输入#为结束:\n");
scanf("%s",&n); // 这里不知道是你有意为之,我就照着这运行程序,如果改成%c,那么程序有几个地方有加入吸收空格的语句,如getchar(),只是输入比较麻烦。。。
下面是我的测试数据(注意什么时候加#)
1
2 3
# 4 5 #
# # # #
整个输入顺序是 1 2 # 4 ## 3 5 ###
不过程序这样设计输入很麻烦,而且输入字符不是用scanf(%c)的格式,而用%s
觉得在一行完成输入好一点, 如12#4##3 5 ###
printf("%s",L->data); // 这里是%c,
下面的sscanf()里的%s对整个程序来说很特别
printf("请输入一个值,输入#为结束:\n");
scanf("%s",&n); // 这里不知道是你有意为之,我就照着这运行程序,如果改成%c,那么程序有几个地方有加入吸收空格的语句,如getchar(),只是输入比较麻烦。。。
下面是我的测试数据(注意什么时候加#)
1
2 3
# 4 5 #
# # # #
整个输入顺序是 1 2 # 4 ## 3 5 ###
不过程序这样设计输入很麻烦,而且输入字符不是用scanf(%c)的格式,而用%s
觉得在一行完成输入好一点, 如12#4##3 5 ###
#4
幫你調好了
主要是下面的問題:
Linklist Create_btree()
{
Linklist L;
char n[16]; //這裡最好弄個大點的字符數組
printf("请输入一个值,输入#为结束:\n");
scanf("%s",n); //因爲你這裡輸入過多字符,可能發生越界。
//L=(Linklist)malloc(sizeof(Btree)); //這行不需要,否則輸入#時 内存瀉漏。
還有ls提到的 printf("%s",L->data); // 这里是%c,
主要是下面的問題:
Linklist Create_btree()
{
Linklist L;
char n[16]; //這裡最好弄個大點的字符數組
printf("请输入一个值,输入#为结束:\n");
scanf("%s",n); //因爲你這裡輸入過多字符,可能發生越界。
//L=(Linklist)malloc(sizeof(Btree)); //這行不需要,否則輸入#時 内存瀉漏。
還有ls提到的 printf("%s",L->data); // 这里是%c,
#include <stdio.h>
#include <stdlib.h>
typedef struct Btree
{
char data;
struct Btree *lchild,*rchild;
}Btree,*Linklist;
Linklist Create_btree()
{
Linklist L;
char n[16];
printf("请输入一个值,输入#为结束:\n");
scanf("%s",n);
//L=(Linklist)malloc(sizeof(Btree));
if(n[0]=='#')
{L=NULL;}
else
{
if(!(L=(Linklist)malloc(sizeof(Btree))))
exit(0);
L->data=n[0];
L->lchild=Create_btree();
L->rchild=Create_btree();
}
return L;
}
void Preorder(Linklist L)
{
if(L==NULL)return;
printf("%c",L->data);
Preorder(L->lchild);
Preorder(L->rchild);
}
void Inorder(Linklist L)
{
if(L==NULL)return;
Inorder(L->lchild);
printf("%c",L->data);
Inorder(L->rchild);
}
void Laorder(Linklist L)
{
if(L==NULL)return;
Laorder(L->lchild);
Laorder(L->rchild);
printf("%c",L->data);
}
int main(void)
{
int x;
Linklist L;
L=(Linklist)malloc(sizeof(Btree));
do{
printf("1...建立二叉树\n");
printf("2...先序遍历\n");
printf("3...中序遍历\n");
printf("4...后序遍历\n");
printf("0...结束\n");
scanf("%d",&x);
switch(x){
case 1:
L=Create_btree();
break;
case 2:
Preorder(L);
printf("\n");
break;
case 3:
Inorder(L);
printf("\n");
break;
case 4:
Laorder(L);
printf("\n");
break;
default :
printf("The End\n");
break;
}
}while(x!=0 && x<=4);
return 0;
}
#5
int main(void)
{
int x;
Linklist L;
//L=(Linklist)malloc(sizeof(Btree)); //這行也是不需要的
{
int x;
Linklist L;
//L=(Linklist)malloc(sizeof(Btree)); //這行也是不需要的
#6
哦哦,其实我也试过用%c,不过会出现如下结果
如果我想实现一个ab##c##的先序遍历,我的函数应该在哪作出修改呢?
我是个新手,在这问题上实在想不明白,如果是用int作为data类型的话这问题就能比较轻松解决了,不过我想知道字符输入这方面我的不足之处
如果我想实现一个ab##c##的先序遍历,我的函数应该在哪作出修改呢?
我是个新手,在这问题上实在想不明白,如果是用int作为data类型的话这问题就能比较轻松解决了,不过我想知道字符输入这方面我的不足之处
#7
谢谢楼上各位的帮忙~~这问题我已经弄明白了~