数据结构课程设计报告

  • 格式:doc
  • 大小:540.50 KB
  • 文档页数:27

课程设计任务书2014 — 2015 学年第1 学期计算机与通信学院(系、部)专业班级课程名称:数据结构设计题目:二叉树操作系统完成期限:自年月日至年月日共周指导教师(签字):年月日系(教研室)主任(签字):年月日数据结构课程设计设计说明书二叉树操作系统起止日期:年月日至年月日学生姓名班级学号成绩指导教师(签字)计算机与通信学院(部)年月日目录1 课程设计简介 (4)1.1 课程设计的目的 (4)1.2 课程设计内容 (4)2 数据结构的设计 (5)2.1 结构体设计 (5)2.1 编译预处理 (5)3 数据结构的分析 (6)3.1 菜单界面 (6)3.2辅助函数和语句 (6)3.3创建和遍历 (7)3.4查找和删除 (8)3.5常用编辑 (8)3.6打印输出 (8)3.7队列和栈 (8)3.8功能菜单 (9)3.9文件操作 (9)4 程序运行结果 (9)4.1二叉树的基本操作 (9)4.2二叉树的主要应用 (10)4.3各部分效果演示 (10)4.4 程序运行解释 (11)5 心得体会 (12)参考文献 (13)附部分源代码 (14)1 课程设计简介1.1 课程设计的目的通过对“二叉树操作系统”的深究,使我对问题进行分析和设计的能力获得加强;使我对二叉树的基本操作、以及主要应用得到了深层次的理解,同时复习了自己的C语言知识,加强了自己对代码的可操作性,为以后编写应用程序打下基础。

熟悉各类编译器的使用,加深自己对数据结构课本的研读,了解更多的算法思维,结合到生活中的实际应用等。

1.2 课程设计内容二叉树操作系统应具备如下的功能:①二叉树基本操作:a)创建二叉树:采用仿先序遍历方式创建一棵二叉树,引入了外部节点b)插入左孩子:默认是根节点,其他则查找后执行同样的操作c)插入右孩子:默认是根节点,其他则查找后执行同样的操作d)查找某节点:对已存入二叉树的中节点信息进行按元素查找e)求叶子数目:遍历加判断确定出叶子节点的数目f)求深度操作:递归求构建的二叉树的深度g)先中后递归打印:先序、中序、后序遍历二叉树的同时打印节点信息h)先中后非递归打印:采用栈、队列、数组实现二叉树的非递归遍历打印i)层次遍历:采用队列实现层次遍历j)各类节点数:计算构建的二叉树内各类度数节点的数目k)树左右互换:默认是根节点,其他节点按元素查找并执行同样的操作l)删除左子树:默认也是根节点,其他节点也是同上方法即可实现m)删除右子树:默认也是根节点,其他节点也是同上方法即可实现n)查找指定节点双亲:查找构建的二叉树内任意节点(根节点除外)的双亲o)查找指定节点孩子:查找构建的二叉树内任意节点(叶子除外)左右孩子p)查找指定节点子孙:查找任意节点的所有子孙节点信息q)查找指定节点祖先:查找任意节点的所有祖先节点信息②二叉树的主要应用:a)二叉排序树:创建二叉、搜索节点、插入节点、删除节点b)最优二叉树:初始操作、编码操作、译码操作、打印操作③其他辅助的维护调整美化工作。

2 数据结构的设计2.1 结构体设计因为涉及到二叉树,我采用的是链式存储方式,以左右孩子指针域存储下整个二叉树的结构,再设置了每个节点应有的数据域存放每个节点的信息。

因为涉及到二叉树非递归遍历涉及到队列和栈,所以我又设计了顺序栈和顺序循环队列的结构类型声明定义;因为二叉树的主要应用有二叉排序树和最优二叉树,但是二叉排序树的数据类型我默认是整型,所以二叉排序树结构类型不做重复声明定义,然而我的最优二叉树节点类型是字符型的,所以我另外设置了新的数据类型。

具体如下:二叉链表结构类型声明定义:typedef struct BTNode //左右孩子表示法---二叉链表{ //为后面的二叉排序树和最优二叉树做准备DataType data; //存放字符型数据ElemType ans; //存放整型数据struct BTNode *lchild; //二叉树的链式存储结构struct BTNode *rchild;}BTNode,*BTree;顺序栈结构类型声明定义:#define MaxStackSize 10000 //主要处理先中后非递归遍历typedef struct{BTree data[MaxStackSize];int top;}SqStack;顺序循环队列结构类型声明定义:#define MAX 10000typedef struct //既然顺序队列的话,那么一个这种结构类型的节点就好了{BTree data[MAX]; //主要处理先中后非递归遍历以及层次遍历int front;int rear;int tag;}SqQueue,*Squeue;2.1 编译预处理考虑到可能需要用到的文件名包括以及宏定义、条件编译等原因,做了足够的编译预处理,但是考虑到报告的填写,这里只列出主要用到的,具体如下:#include<queue>#include<stack>#include<math.h>#include<stdio.h>#include<iostream>#include<string.h>#include<stdlib.h>#include<malloc.h>using namespace std;typedef int ElemType;typedef char DataType;#include"SqStack.h"#include"SqQueue.h"#include"二叉树基本操作.h"#include"二叉排序树.h"#include"哈夫曼树.h"3 功能模块(或算法)描述在实现程序的时候并没有完全按照书上给出的函数来进行设计,在实际的过程中用到了将近50个函数,大部分函数是实现核心功能的,还有一部分函数是用来美化控制台的输出操作以及功能菜单(加强用户对程序的可操作性),期间还涉及到了C++ STL库函数应用操作。

3 数据结构的分析3.1 菜单界面main() 主函数Basic_operation(root); 显示“二叉树的基本操作”功能界面Fuction_BTree(root); 显示“二叉排序树”功能界面Fuction_HuffumanTree(root); 显示“哈夫曼树”功能界面3.2辅助函数和语句system(“cls”); //控制台清屏函数system(“pause”); //输出暂停函数system("color 0b"); //设置控制台颜色函数Sleep(100); //延时函数fclose() //文件关闭函数fopen() //文件打开函数rewind() //文件指针重定位函数fgetc() //以字符方式进行文件读写函数fputc() //以字符方式进行文件读写函数fprintf() //以格式化方式进行文件读写函数fscanf() //以格式化方式进行文件读写函数system("mode con:cols=400 lines=30000"); //调节控制台大小函数goto语句的使用 //循环设置switch语句 //多路分支语句3.3创建和遍历void CreateBiTree(BTNode **root) //仿先序遍历创建二叉树BTree CreateHuf(ElemType a[],int n) //建立哈夫曼树void Create_BTree(BTree *root) //建立二叉排序树void Pre_order_Rec(BTree root) //先序遍历递归版void In_order_Rec(BTree root) //中序遍历递归版void Post_order_Rec(BTree root) //后序遍历递归版void LevelOrder_First(BTree Tree) //层次遍历C++ STL实现void LevelOrder_Second(BTree Tree) //层次遍历指针数组模拟队列void LevelOrder_Third(BTree root) //C语言自写队列void PreOrder_NonRec_First(BTree root) //先序非递归其一void PreOrder_NonRec_Second(BTree Tree) //先序非递归其二void PreOrder_NonRec_Third(BTree Tree) //先序非递归其三void PreOrder_NonRec_Fouth(BTree Tree) //先序非递归其四void InOrder_NonRec_First(BTree root) //中序非递归其一void InOrder_NonRec_Second(BTree T) //中序非递归其二void InOrder_NonRec_Third(BTree T) //中序非递归其三void PostOrder_NonRec_Second(BTree T) //后序非递归其一void PostOrder_NonRec_Third(BTree T) //后序非递归其二3.4查找和删除void Find_Child_Bnode(BTNode *p,BTNode **p_lchild,BTNode **p_rchild)int Find_Parent_Bnode(BTree root,BTNode *p,BTNode **p_parent)void FindDescendants_Blist(BTNode *p) //查找指定节点子孙void FindAncersors_Blist(BTree root,BTNode *p) //查找祖先节点int Insearch_BTree(BTree root,DataType x,BTree &p) //根据元素指定查找3.5常用编辑BTree Insert_LeftNode(BTree father,DataType x) //给某节点插入左孩子BTree Insert_RightNode(BTree father,DataType x) //给某节点插入右孩子BTree Delete_LeftTree(BTree Node) //删除左子树BTree Delete_RightTree(BTree Node) //删除右子树void Destroy_BTree(BTree *root) //通过释放节点达到销毁的目的void Exchange_BTree(BTree root) //交换所有节点的左右子树void NodeCount_Rec(BTree root) //基于后序遍历的二叉树各类结点统计递归算法3.6打印输出void In_order_Rec_BST(BTree root) //中序遍历输出二叉排序结果void Print_BTree(BTree root) //以广义表形式显示哈夫曼树的结构3.7队列和栈void Init_Squeue(Squeue &head) //队列初始化void En_Squeue(Squeue head,BTree e) //入队void De_Squeue(Squeue head,BTree *e) //出队int Empty_Squeue(SqQueue head) //队空判断int Full_Squeue(SqQueue head) //队满判断void StackInitiate(SqStack *S) //栈初初始化int StackPush(SqStack *S,BTree x) //入栈int StackPop(SqStack *S,BTree *d) //出栈int StackNotEmpty(SqStack S) //栈空判断3.8功能菜单void Basic_operation(BTree root) //二叉树基本操作功能菜单Fuction_BTree(root); //二叉排序树功能菜单Fuction_HuffumanTree(root); //哈夫曼树功能菜单3.9文件操作void Hufcoding(BTree root,int len,FILE *fp,FILE *fp2)//哈夫曼编码写入文件void Decoding_HuffumanTree(BTree root,FILE *fp1)//哈夫曼译码写入文件4 程序运行结果4.1二叉树的基本操作4.2二叉树的主要应用4.2.1 二叉排序树界面4.2.2 最优二叉树界面4.3各部分效果演示4.4 程序运行解释1、输入abc####,构建一颗如下所示的二叉树:2、二叉排序树构建,输入5个节点信息分别为5,3,1,7,8构建一棵如下的树:3、哈夫曼树的应用,输入6个叶子节点的权值(3,9,5,12,6,15),构建一棵如下树:代码根据仿先序遍历的思维(引入了外部节点#,实则为NULL),创建了一棵左斜树。