实习报告
题目:一个表达式和一棵二叉树之间,存在着自然的对应关系.写一个程序,实现基于二叉树表示的算术表达式Expression的操作.
班级:计算机06(1)姓名:崔敬敏学号:23020062203744完成日期:2016.5.21
:cjm363959255@gmail.
一、需求分析
1—》假设算术表达式Expression内可以含有变量(a~z)Createtrix(&,T,definition),
初始条件:definition给出二叉树T的定义.
操作结果:按definition构造二叉绎T.
2.主程序
Voidmain(){
初始化,
Do{
接受命令,
处理命令,
}while("命令"!等于"输出"),
}
3.本程序只有两个模块,调用关系简单.
主程序模块
二叉树模块
三、详细设计
1,元素类型,结点类型和指针类型
//------------------二叉树的二叉链表的存储表示------------------------//
Typedefstructbitnode{
Telemtypedata,
Structbitnode*lchild,*rchild,
}bitnode,*bitree,
//------------------基本操作的函数的原型说明(部分)------------------//
Statuscreatebitree(bitree&,T),
//按先序次序输入法二叉树中结点的值(一个字符),
//空格字符表示空树,构造二叉链表表示的二叉树T.
StatusPreOrderTrers(bitreeT,status(*Visit)(telemtypee)),
//采用二叉链表存储结构,Visit是对结点操作的应用函数.
//先序遍历二叉树T,对每个结点调用函数Visit一次且仅一次.
//一旦Visit()失败,则操作失败.
StatusInOrderTrers(bitreeT,status(*Visit)(telemtypee)),
//采用二叉链表存储结构,Visit是对结点操作的应用函数.
//中序遍历二叉树T,对每个结点调用函数Visit一次且仅一次.
//一旦Visit()失败,则操作失败.
StatusPostOrderTrers(bitreeT,status(*Visit)(telemtypee)),
//采用二叉链表存储结构,Visit是对结点操作的应用函数.
//后序遍历二叉树T,对每个结点调用函数Visit一次且仅一次.
//一旦Visit()失败,则操作失败.
StatusLevelOrderTrers(bitreeT,status(*Visit)(telemtypee)),
//采用二叉链表存储结构,Visit是对结点操作的应用函数.
//层序遍历二叉树T,对每个结点调用函数Visit一次且仅一次.
//一旦Visit()失败,则操作失败.
四、调试分析
1.建立一个表达式树的时候,开始只是套用所写的算法,没有考虑到C语言中没有引用调用,在老师的指导下通过修改算法返回和参数,将创建问题解决了.
2.由于一直只是将叶子结点存在一个数组中,开始的想法是存取的时候比较方便,没有考虑到后来计算过程要用将临时结果存储在运算符的结点数据域中,使得开始计算时非常麻烦.最后通过修改结点的存储结构:即在每一个结点处另设一个数据域存储临时计算结果.
3.在对同一个表达式中的不同未知数赋值时遇到一些问题,就因为回车符的干扰使得程序运行的结果不能像预想的那样运行,通过请教陈美彬同学,对回车符作了接收并设了一个临时变量作为赋值是否成功的标志,解决了此问题.
4.在写程序过程中,对部分的回车符要作特别的接收处理.
5.在创建二叉树过程中没有注意到由getchar()的是连续输入的,不用逐个接收.用#来代表空指针.
6.用书上的算法怎么建立一个树呀
voidReadExpr(bitnode*T)
{
charch,
printf("请输入下一个字符:\n"),
ch等于getchar(),
if(ch等于等于'#')
T等于NULL,
else
{
if(!(T等于(bitnode*)malloc(sizeof(bitnode))))exit(0),
T->,data等于ch,
ReadExpr(T->,lchild),
T->,lchild等于NULL,
ReadExpr(T->,rchild),
T->,rchild等于NULL,
}
}
voidmain()
{
ReadExpr(&,E),
printf("OK\n"),
}
ReadExpr()函数的主要问题是T->,lchild和T->,rchild都未定义呢,怎么用!应当注意,C和C++都是传值调用,没办法直接实现引用调用的
在C或C++实现时,应该对书上的算法进行修改,例如:
bitnode*ReadExpr(void)
{bitnode*T,
charch,
printf("请输入下一个字符:\n"),
ch等于getchar(),
if(ch等于等于'#')
T等于NULL,
else
{
if(!(T等于(bitnode*)malloc(sizeof(bitnode))))exit(0),
T->,data等于ch,
T->,lchild等于ReadExpr(),
T->,rchild等于ReadExpr(),
}
returnT,
}
7.怎样输入呀,我用了好几种输入方式都不能终止
按照上面定义的函数,正确的输入方式应当是根据要建立的具体的树的形态,给出先序遍历序列,而且这个序列中所有的空指针都要用#表示出来,比如仅有根的树"3##",有三个节点的树"-9##3##"
特别需要注意的是因为输入采用的是getchar()
,所以输入的时候要连续给出,中间不要有回车或者其他符号,否则都会被当作是一个节点
五、用户手册
1.本程序的运行环境为DOS操作系统,执行文件为:a.exe.
2.进入演示程序后即使显示文本方式的用户界面.
3.按提示语进行操作,输入各个未知数.
4.输入完毕,按enter即使输出运算结果.
六、测试结果
0等于0,(a等于6)a等于6,-91等于8,(a等于2,b等于3,c等于4)+a*(bc)等于14,
(x等于8)+*5^x2*8x等于384,
(x等于5)+++*3^x3*2^x2x6等于436
七、附录
源程序文件名清单:
#include<,stdio.h>,
#include<,stdlib.h>,
#include<,string.h>,