目录第一章需求分析 (1)1.1课程设计题目 (1)1.2 课程设计任务及要求 (1)1.21 课程设计目的 (1)1.22设计要求 (1)1.3课程设计思想 (2)1.4软件运行环境及开发工具 (2)第二章概要设计 (3)2.1 数据结构 (3)2.2 所用方法及其原理说明 (3)第三章详细设计 (4)3.1详细设计方案 (4)3.2 模块设计 (4)3.21二叉树定义 (4)3.22 树状显示二叉树设计 (7)3.22 主函数设计 (10)第四章调试和操作说明 (11)4.1 调试 (11)4.2 操作说明 (12)第五章总结与体会 (12)5.1本文的主要工作 (12)5.2 存在问题 (12)5.3心得体会 (12)致谢 (13)参考文献 (14)第一章需求分析1.1课程设计题目树状显示二叉树:编写函数displaytree(二叉树的根指针,数据值宽度,屏幕的宽度)输出树的直观示意图。
输出的二叉树是垂直打印的,同层的节点在同一行上。
[问题描述]假设数据宽度datawidth=2,而屏幕宽度screenwidth为64=26,假设节点的输出位置用(层号,须打印的空格数)来界定。
第0层:根在(0,32)处输出;第1层:因为根节点缩进了32个空格,所以下一层的偏移量(offset)为32/2=16=screenwidth/22。
即第一层的两个节点的位置为(1,32-offset),(1,32+offset)即(1,16),(1,48)。
第二层:第二层的偏移量offset为screenwidth/23。
第二层的四个节点的位置分别是(2,16-offset),(2,16+offset),(2,48-offset),(2,48+offset)即(2,8),(2,24),(2,40),(2,56)。
……第i层:第i层的偏移量offset为screenwidth/2i+1。
第i层的每个节点的位置是访问第i-1层其双亲节点时确定的。
假设其双亲的位置为(i-1,parentpos)。
若其第i层的节点是其左孩子,那末左孩子的位置是(i,parentpos-offset),右孩子的位置是(i,parentpos+offset)。
[实现提示]利用二叉树的层次遍历算法实现。
利用两个队列Q,QI。
队列Q中存放节点信息,队列QI中存相应于队列Q中的节点的位置信息,包括层号和需要打印节点值时需要打印的空格数。
当节点被加入到Q时,相应的打印信息被存到QI中。
二叉树本身采用二叉链表存储。
1.2 课程设计任务及要求1.21 课程设计目的据结构是计算机专业的核心课程,是一门实践性很强的课程。
课程设计是加强学生实践能力的一个强有力手段,要求学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C(C++)程序并上机调试的基本方法,还要求学生在完成程序设计的同时能够写出比较规范的设计报告。
严格实施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。
1.22设计要求1、课程设计题目每组一题,每个学生必须独立完成;2、课程设计时间为2周;3、设计语言C(C++)不限;14、上机任务1)选择合适的数据结构,并定义数据结构的结构体;2)根据程序所要完成的基本要求,设计出完整的算法;3)设计出主程序(main函数),使其成为完整的程序。
6、上机时间:按照实验室上机时间安排计划执行7、无论在校外、校内,都要严格遵守学校和所在单位的学习和劳动纪律、规章制度,学生有事离校必须请假。
课程设计期间,无故缺席按旷课处理;缺席时间达四分之一以上者,其成绩按不及格处理。
1.3课程设计思想二叉树是一种树形结构,它的特点是每个结点至多有两棵子树,即二叉树中不存在度大于2的结点,并且二叉树的子树有左右之分,其次序不能任意颠倒。
本设计主要根据二叉树的性质原理为设计的主体思路,二叉树的性质如下: 性质1:在二叉树的第i层上至多有2i-1个结点(i>=1);性质2:深度为K的二叉树至多有2k-1个结点(K>=1);性质3:如果一棵有n各结点的完全二叉树的结点按层次编号,则对任一结点i(1<=i<=n),有:(1)若2i>n,则结点无左孩子,否则其左孩子是结点2i;(2)若2i+1>n,则结点i无右孩子,否则其右孩子为2i+1;另外,本设计利用二叉树的广度优先搜索算法实现。
利用两个队列Q,QI。
队列Q中存放节点信息,队列QI中存相应于队列Q中的节点的位置信息,包括层号和需要打印节点值时需要打印的空格数。
当节点被加入到Q时,相应的打印信息被存到QI中。
二叉树本身采用二叉链表存储。
本设计应用了C语言中的类来自定义头文件,将任务分成多个的模块,增强了可读性和简单性,同时为日后的编写,调试,维护提供了极大地方便。
1.4软件运行环境及开发工具本设计用到的软件是Microsoft Visual C++ 6.0程序开发软件,Microsoft Visual C++ 6.0是20世纪90年代中期由美国微软公司推出的一个强大的Windows应用程序开发平台,是“真正的程序员”首选的开发工具之一,也是有志于程序设计的程序员、大中专院校学生进入高级程序设计领域的首选软件之一。
Microsoft Visual C++ 6.0程序开发软件提供了一个可视化集成编程环境,能自动生成Windows应用程序的共有部分,帮助程序设计人员直接切入实际功能部分的代码编制主题,从而大大简化了复杂的Windows应用程序开发过程,极大的提高了程序设计的效率,其次, VC++功能强大,内容浩瀚在该环境下用户可以开发有关C和C++的各种应用程序,应用程序的开发包括建立、编辑、浏览、链接和调试等操作。
2第二章概要设计2.1数据结构树状显示二叉树是二叉树的一种自然显示方法,本设计结果将二叉树形象的显示在屏幕上,直观易懂。
因此本设计将对树状显示二叉树的设计步骤进行详细说明。
首先得构造一个数组来存储整个二叉树的结点信息,建立两个队列Q和QI,队列Q中存放节点信息,队列QI中存相应于队列Q中的节点的位置信息,包括层号和需要打印节点值时需要打印的空格数。
当节点被加入到Q时,相应的打印信息被存到QI中。
然后通过插入排序算法来构造一个二叉树,并用二叉树的层次遍历来使二叉树有顺序的存入队列Q,最后通过队列QI使得二叉树树状的显示在屏幕上。
该程序的主要流程图如图2-1所示。
2.2 所用方法及其原理说明本设计主要运用了树的广度优先搜索和队列的先进先出的特点,树的广度优先搜索功能如下:假设从图中某顶点v出发,在访问了v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直至图中所有已被访问的顶点的邻接点都被访问到。
若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。
队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端删除元素。
在队列中允许插入的一端叫队尾,允许删除的一端叫对头。
队列的示意图如下:图1 二叉树示意图3第三章详细设计3.1详细设计方案本设计利用两个队列Q,QI,队列Q中存放结点信息,队列QI中存相应于队列Q中的节点的位置信息,包括层号和需要打印节点值时需要打印的空格数。
当节点被加入到Q时,相应的打印信息被存到QI中。
用二叉树(二叉树本身采用二叉链表存储)的层次遍历算法实现了二叉树的树状显示。
本设计应用了C语言中的类来自定义头文件,将任务分成多个的模块,增强了可读性和简单性,同时为日后的编写,调试,维护提供了极大地方便。
3.2 模块设计本程序包括三部分,即二叉树定义部分(MyHeap.h),树状显示二叉树的实现(MyHeap.cpp)部分以及最重要的主函数部分(main.cpp)。
下面将对各模块设计思想及设计方法进行详细的说明。
3.21二叉树定义需要显示的二叉树的示意图如下:图2 树状二叉树#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define TElemType char#define OK 14#define ERROR 0#define OVERFLOW -2#define TRUE 1#define FALSE 0typedef int Status ;#define MAXQSIZE 100typedef struct BiNode{int data;struct BiNode *lchild;struct BiNode *rchild;}BiNode, *BiTree;typedef int ElemType;typedef struct{ElemType *base; /*数组首地址*/int front; /*头指针,若队列不空,指向队列头元素*/int rear; /*尾指针,若队列不空,指向队列尾元素的下一个位置*/ }SqQueue;typedef struct{int level;int pos;bool enter;int spaceNum;}DisplayInfo;Status insert(BiTree bt,int key){BiTree p,q,newNode;newNode=(BiTree)malloc(sizeof(BiNode));p=NULL;q=bt;while(q){p=q;if(key<q->data)q=q->lchild;elseq=q->rchild;}if(p){if(key<p->data)p->lchild=newNode;5elsep->rchild=newNode;}elsebt=newNode;}Status InitQueue(SqQueue *Q){Q->base=(ElemType *)malloc(MAXQSIZE*sizeof(ElemType)); if (!Q->base){printf("分配空间失败!");return OVERFLOW;}Q->front=0;Q->rear=0;return OK;}EnQueue(SqQueue *Q, ElemType e){/* 插入元素e为新的队尾元素 */if ( (Q->rear+1)%MAXQSIZE==Q->front ){printf("队列满了!");return ERROR;}Q->base[Q->rear]=e;Q->rear=(Q->rear+1)%MAXQSIZE;}DeQueue(SqQueue *Q, ElemType *e){/* 删除队头元素,并由e返回其值 */if (Q->front==Q->rear) return ERROR;*e=Q->base[Q->front];Q->front=(Q->front+1)%MAXQSIZE;}Status IsEmpty(SqQueue *Q){if (Q->front==Q->rear) return OK;else return ERROR;}BiTree CreateBiTree(BiTree bt){char ch;6scanf("%c",&ch);if(ch=='.') bt=NULL;else{bt=(BiTree)malloc(sizeof(BiNode)); /* 生成根结点 */bt->data=ch;bt->lchild=CreateBiTree(bt->lchild); /* 生成左子树 */bt->rchild=CreateBiTree(bt->rchild); /* 生成右子树 */}return bt;}程序功能说明:该段程序分别用三个结构体定义了二叉树、队列和树的显示信息,还包含该程序需要用到C语言头文件、数据定义和二叉树的建立、队列的插入与删除等函数,是整个程序的基础。