逻辑算法大赛辅导--设计实现抽象数据类型二叉树的演示程序

zengyiCSTC 2004-02-16 11:31:32


本程序设计实现抽象数据类型二叉树的演示程序
程序设计思想概述
1.抽象数据类型
ADT tree{
数据对象: D={x/x charset,x=A,B,C,#}
基本操作:
Createtree (FLIE fp , &T , int i )
操作结果:从制定文件读取数据,构造一个二叉树
Preordertree ( &T)
初始条件:二叉树已存在
操作结果:先序遍历二叉树
Inordertree (&T)
初始条件:二叉树已存在
操作结果:中序遍历二叉树
Backtree(&T)
初始条件:二叉树已存在
操作结果:后序遍历二叉树
Printfleaves(&T)
初始条件:二叉树已存在
操作结果:显示叶子结点
Displaytree (&T)
初始条件:二叉树已存在
操作结果:
Cleartree(&T)
初始条件:二叉树已存在
操作结果:清除二叉树

2.主程序的主要模块
(1).主函数模块
main(){
do{
接受命令;
处理命令(1?);
}while(?#21629;令6??#36864;出?;
}
(2).初始化模块
(3).显示叶子结点模块
(4).三序遍历模块
(5).显示二叉树模块
(6).清空空间模块

五.调试分析
在设计函数时,我想给每个结点都存一个层树,起初我给主函数中传一个整形变量i,并在函数中给它赋值。
即:Createtree(FILE *fp, &T , int i)
{ i=0;ceng=i++;
?.
}

main()
{Createtree(fp, &T,int i)

}
但因函数为递归调用,造成每个结点的层数都相同。后来我给函数传了一个常量,便解决了这个问题。
即: Createtree(FILE *fp, &T , int i)
{ ceng=i++;
}

main()
{ Createtree(fp,T,1);
?.
}
用户手册
运行程序后,会出现下列菜单,请先选择1 建立二叉树,然后再进行其他操作。
结束操作时,请选择5再退出。
1 建立二叉树
2 三序遍历二叉树
3 打印叶子结点
4 打印二叉树
5 清空二叉树
6 退出
程序源代码发布:
#include"stdio.h"
#include"stdlib.h"
#include"conio.h"
#define NULL 0

typedef struct tree
{ char data;
struct tree *lchild,*rchild;
int ceng;
}*treep;


void Createtree(FILE *fp,treep &T,int i)
{ char ch;
ch=fgetc(fp);
if(ch=='#') T=NULL;
else
{T=(struct tree *)malloc(sizeof(struct tree));
T->data=ch;T->ceng=i++;
Createtree(fp,T->lchild,i);
Createtree(fp,T->rchild,i);
}
}



void Preordertree(treep &T)
{ if(T)
{printf("%c",T->data);
Preordertree(T->lchild);
Preordertree(T->rchild);
}
}


void Inordertree(treep &T)
{ if(T)
{Inordertree(T->lchild);
printf("%c",T->data);
Inordertree(T->rchild);
}
}


void Backordertree(treep &T)
{ if(T)
{Backordertree(T->lchild);
Backordertree(T->rchild);
printf("%c",T->data);
}
}

Travel(treep &T)
{ int m;
printf("1.先序遍历二叉树\n 2.中序遍历二叉树 \n 3.后序遍历二叉树\n");
do{
printf("请输入选择(1-3)");
scanf("%d",&m);
}while(m<1||m>3);
switch(m)
{case(1):Preordertree(T);break;
case(2):Inordertree(T);break;
case(3):Backordertree(T);break;
}
}




Printleaves(treep &T)
{if(T)
{if(T->lchild==NULL&&T->rchild==NULL)
{printf("%c",T->data);
}
Printleaves(T->lchild);
Printleaves(T->rchild);
}
}


Displaytree(treep &T)
{if(T)
{
Displaytree(T->rchild);
if((!(T->rchild==NULL))&&(!(T->lchild==NULL)))printf("%*c< \n",T->ceng*3,T->data);
if((T->rchild==NULL)&&(!(T->lchild==NULL)))printf("%*c\ \n",T->ceng*3,T->data);
if((!(T->rchild==NULL))&&(T->lchild==NULL))printf("%*c/ \n",T->ceng*3,T->data);
if((T->rchild==NULL)&&(T->lchild==NULL)) printf("%*c \n",T->ceng*3,T->data);
Displaytree(T->lchild);
}
}


Cleartree(treep &T)
{if(T)
{Cleartree(T->lchild);
Cleartree(T->rchild);
free(T);
}
}

main()
{ clrscr();
int n,m;
struct tree *T,*head;
FILE *fp;
fp=fopen("a:\\tree.txt","r");

printf("1 建立二叉树\n");
printf("2 三序遍历二叉树\n");
printf("3 打印叶子结点\n");
printf("4 打印二叉树\n");
printf("5 清空二叉树\n");
printf("6 退出\n");
do{
do{
printf("\n请输入你的选择(1-6)\n");
scanf("%d",&n);
}while(n<1||n>6);

switch(n)
{ case 1:{if(fp==NULL)
{ printf("cannot open tree.txt\n");
getch();
exit(0);
}
Createtree(fp,T,1);
//Preordertree(T);
head=T;
fclose(fp);
}break;
case 2: Travel(T);break;
case 3: Printleaves(T);break;
case 4: Displaytree(T);break;
case 5: {Cleartree(T);printf("This tree is empty\n");}break;
case 6: {printf("\n\n\n\n\n\n\n\n\n%*c 欢迎使用本软件。\n",60,' ');
printf("%*c 下次再见.\n",60,' ');
printf("%*c 曾毅\n",70,' ');break;
}

}
}while(n!=6);

}
...全文
77 点赞 收藏 4
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复

还没有回复,快来抢沙发~

相关推荐
发帖
其他
创建于2009-10-09

224

社区成员

其他产品/厂家
申请成为版主
帖子事件
创建了帖子
2004-02-16 11:31
社区公告
暂无公告