二叉链表结构相关函数库的设计.docx

上传人:b****6 文档编号:7940753 上传时间:2023-01-27 格式:DOCX 页数:14 大小:82.23KB
下载 相关 举报
二叉链表结构相关函数库的设计.docx_第1页
第1页 / 共14页
二叉链表结构相关函数库的设计.docx_第2页
第2页 / 共14页
二叉链表结构相关函数库的设计.docx_第3页
第3页 / 共14页
二叉链表结构相关函数库的设计.docx_第4页
第4页 / 共14页
二叉链表结构相关函数库的设计.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

二叉链表结构相关函数库的设计.docx

《二叉链表结构相关函数库的设计.docx》由会员分享,可在线阅读,更多相关《二叉链表结构相关函数库的设计.docx(14页珍藏版)》请在冰豆网上搜索。

二叉链表结构相关函数库的设计.docx

二叉链表结构相关函数库的设计

数据结构课程设计报告

 

课程设计

课程名称:

数据结构课程设计

设计课题:

二叉链表结构相关函数库的设计

指导教师:

夏容

总评成绩:

 

专业:

电子商务班级:

1383021

姓名:

梁智强学号:

138302120

二O一五年一月七日

目录

一、序言3

1、关于数据结构3

2、数据结构课程设计的目的3

二、需求分析4

1、题目要求4

三、概要设计4

1、课程设计思想4

2、数据结构分析4

3、总体功能流程图........................................................5

四、程序测试与实现11

  1、函数之间的调用关系....................................................11

2、主程序11

3、测试数据............................................................................................................................15

4、测试结果............................................................................................................................15

五、调试与分析.....................................................15

六、总结15

一、序言

1、关于数据结构

数据结构是一门理论性强、思维抽象、难度较大的课程,是基础课和专业课之间的桥梁。

该课程的先行课程是计算机基础、程序设计语言、离散数学等,后续课程有操作系统、编译原理、数据库原理、软件工程等。

通过本门课程的学习,我们应该能透彻地理解各种数据对象的特点,学会数据的组织方法和实现方法,并进一步培养良好的程序设计能力和解决实际问题的能力,而且该课程的研究方法对我们学生在校和离校后的学习和工作,也有着重要的意义。

数据结构是计算机科学与技术专业的一门核心专业基础课程,在该专业的课程体系中起着承上启下的作用,学好数据结构对于提高理论认知水平和实践能力有着极为重要的作用。

学习数据结构的最终目的是为了获得求解问题的能力。

对于现实世界中的问题,应该能从中抽象出一个适当的数学模型,该数学模型在计算机内部用相应的数据结构来表示,然后设计一个解此数学模型的算法,再进行编程调试,最后获得问题的解答。

基于此原因,我们开设了数据结构课程设计。

针对数据结构课程的特点,着眼于培养我们的实践能力。

实习课程是为了加强编程能力的培养,鼓励学生使用新兴的编程语言。

相信通过数据结构课程实践,无论是理论知识,还是实践动手能力,同学们都会有不同程度上的提高。

2、数据结构课程设计的目的

通过课程设计题目的练习,强化学生对所学知识的掌握及对问题分析和任务定义的理解,对每到题目作出了相应的逻辑分析和数据结构的选择,通过对任务的分析,为操作对象定义相应的数据结构,以过程化程序设计的思想方法为原则划分各个模块,定义数据的抽象数据类型。

分模块对题目进行设计,强化学生对C语言的掌握和对数据结构的选择及掌握。

通过程序的编译掌握对程序的调试方法及思想,并且让学生学会使用一些编程技巧。

促使学生养成良好的编程习惯,以及让学生对书本上的知识进行了实践。

算法与数据结构这门课是计算机科学中一门综合性的专业基础课。

它不仅是计算机学科的核心课程,而且已成为其它理工专业的热门选修课。

它又是操作系统、编译原理、数据库原理、算法分析、人工智能、图象处理等专业课程的前导课。

具有承上启下的作用。

数据结构的研究不仅涉及到计算机硬件的研究范围,而且和计算机软件的研究有着密切的关系。

计算机科学各领域及有关的应用软件都要用到数据结构。

该课程的目的就是介绍一些最常用的数据结构,阐明数据结构内在的逻辑关系,讨论它们在计算机中的存储表示,并结合各种典型应用说明它们在进行各种运算时的动态性质及实际的执行算法。

二、需求分析

1、题目要求

二叉链表结构相关函数库的设计

1、问题描述

实现二叉链表的各种基本操作。

2、设计要求

设计二叉链表存储结构的各种基本运算以便在程序中使用:

建立二叉链表、先序遍历二叉树、中序遍历二叉树、后序遍历二叉树等。

3、数据结构

本课程设计使用的数据结构二叉链表。

三、概要设计

1、课程设计思想

本次课程设计中,用到的主要知识就是递归思想,着重体会递归的思想。

建立二叉树采用先序次序插入的方式。

对二叉树进行遍历时采用递归函数和非递归的方式,求二叉树的深度及叶子节点个数采用递归方式。

2、数据结构分析 

本程序分为:

7大模块。

二叉树的建立链式存储结构、前序遍历、中序遍历、后序遍历、求叶子结点的个数计算、中序遍历、后序遍历、深度、主函数。

 

1、二叉树的建立链式存储结构;首先typedef struct BiTNode:

定义二叉树的链式存储结构,此处采用了每个结点中设置三个域,data:

即值域,*lchild:

左指针域和rchild:

右指针域。

 

2、二叉树的前序遍历;利用二叉链表作为存储结构的前序遍历:

先访问根结点,再依次访问左右子树。

 

3、二叉树的中序遍历;利用二叉链表作为存储结构的中序遍历:

先访问左子数,再访问根结点,最后访问右子树。

 

4、二叉树的后序遍历;利用二叉链表作为存储结构的前序遍历:

先访问左右子树,再访问根结点。

 

5、求二叉树的深度:

首先判断二叉树是否为空,若为空则此二叉树的深度为0。

否则,就先别求出左右子树的深度并进行比较,取较大的+1就为二叉树的深度。

 

6、二叉树的求叶子结点的个数计算;先分别求得左右子树中各叶子结点个数,再计算出两者之和即为二叉树的叶子结点数。

 

7、主函数。

主函数中分别调用各函数。

3、总体功能流程图

 

1、存储结构的建立由递归函数实现

具体函数为:

typedefstructBiTNode

{

chardata;

structBiTNode*lchild,*rchild;

}BiTNode,*BiTree;

typedefstructstack

{

inttop;

BiTreestacklist[maxsize];

}stack,*sqlist;

BiTreeCreatBiTree(BiTreeT)

{

charp;

scanf("%c",&p);

if(p=='0')T=NULL;

else

{T=(BiTNode*)malloc(sizeof(BiTNode));

T->data=p;

T->lchild=CreatBiTree(T->lchild);

T->rchild=CreatBiTree(T->rchild);

}

returnT;

}

                                  

在创建的二叉树中,左右孩子都为字符型。

 

char的作用是输入n个任意的字符,而且在输入n个字符后,必须输入n+1个‘0',才能得到本程序所有能够实现的功能。

T=NULL是将二叉树置空。

 

T=(BiTNode*)malloc(sizeof(BiTNode)),采用动态申请新结点的方式,不仅实现起来方便,而且还节省大量的存储空间。

 

T->data=p;值域T->lchild=CreatBiTree(T->lchild); 

 T->rchild=CreateBiTree(T->rchild); 

将二叉树中的每一个结点设置为:

值域,左指针域,右指针。

 这一小段程序实现了二叉树的置空,二叉树的建立,二叉树的存储。

2、先序遍历:

先访问根结点,再访问左子树,最后访问右子树。

具体函数为:

voidPreOrderTraverse(BiTreeT)

{

if(T!

=NULL)

{printf("%c",T->data);

PreOrderTraverse(T->lchild);

PreOrderTraverse(T->rchild);

}

}

3、中序遍历:

先访问左子树,再访问根结点,最后访问右子树。

具体函数为:

voidInOrderTraverse(BiTreeT)

{

if(T!

=NULL)

{InOrderTraverse(T->lchild);

printf("%c",T->data);

InOrderTraverse(T->rchild);

}

}

4、后序遍历:

先访问左子树,再访问右子树,最后访问根结点。

具体函数为:

voidLastOrderTraverse(BiTreeT)

{

if(T!

=NULL)

{LastOrderTraverse(T->lchild);

LastOrderTraverse(T->rchild);

printf("%c",T->data);

}

}

5、求二叉树的深度:

 

先定义三个整形变量m,n.如果树为空,则depth=0;否则,先分别访问出左右子树的深度,再进行比较,将较大的+1的结果就是所求二叉树的深度。

 

具体函数为:

 intdepth(BiTreeT)

{

intm,n;

if(T==NULL)return0;

else

{

m=depth(T->lchild);

n=depth(T->rchild);

return(m>n)?

m+1:

n+1;

}

6、求叶子结点的个数:

 

用leafcount变量表示叶子结点的总个数,用leafcount(T->lchild)、leafcount(T->rchild)分别表示访问的左右子树中叶子结点的个数。

当树为空是此时讨论叶子结点个数无意义;当树非空时分为:

 

一、左右子数都不存在时,即叶子结点的个数为1;

二、左右子树存在,就用分别访问出左右子树中叶子结点的个数,两者相加就为二叉树叶子结点的个数。

 

具体函数为:

 

intleafcount(BiTreeT)

{

if(!

T)return0;

elseif(!

T->lchild&&!

T->lchild)return1;

elsereturnleafcount(T->lchild)+leafcount(T->rchild);

}

7、主函数:

 

包括:

二叉树的数据结构BiTree、函数CreateBiTree、depth、leafcount、前序遍历PreOrderTraverse、中序遍历InOrderTraverse、后序遍历LastOrderTraverse。

 

具体函数为:

voidmain()

{

BiTreeT=NULL;

intp,w,v;

printf("请输入二叉树序列:

\n");

T=CreatBiTree(T);

if(!

T)

printf("该二叉树为空!

\n");

else

{

printf("先序序列如下:

\n");

PreOrderTraverse(T);

printf("\n\n");

printf("中序序列如下:

\n");

InOrderTraverse(T);

printf("\n\n");

printf("后序序列如下:

\n");

LastOrderTraverse(T);

printf("\n\n");

printf("二叉树的深度是:

");

w=depth(T);

printf("%d\n",w);

printf("二叉树的叶子节点的数目为:

");

v=leafcount(T);

printf("%d",v);

printf("\n\n");

}

}

 

四、程序测试与实现

1、函数之间的调用关系

 

2、主程序

#include

#include

typedefstructBiTNode

{

chardata;

structBiTNode*lchild,*rchild;

}BiTNode,*BiTree;

 

BiTreeCreatBiTree(BiTreeT)

{

charp;

scanf("%c",&p);

if(p=='0')T=NULL;

else

{T=(BiTNode*)malloc(sizeof(BiTNode));

T->data=p;

T->lchild=CreatBiTree(T->lchild);

T->rchild=CreatBiTree(T->rchild);

}

returnT;

}

voidPreOrderTraverse(BiTreeT)

{

if(T!

=NULL)

{printf("%c",T->data);

PreOrderTraverse(T->lchild);

PreOrderTraverse(T->rchild);

}

}

voidInOrderTraverse(BiTreeT)

{

if(T!

=NULL)

{InOrderTraverse(T->lchild);

printf("%c",T->data);

InOrderTraverse(T->rchild);

}

}

voidLastOrderTraverse(BiTreeT)

{

if(T!

=NULL)

{LastOrderTraverse(T->lchild);

LastOrderTraverse(T->rchild);

printf("%c",T->data);

}

}

 

intdepth(BiTreeT)

{

intm,n;

if(T==NULL)return0;

else

{

m=depth(T->lchild);

n=depth(T->rchild);

return(m>n)?

m+1:

n+1;

}

}

intleafcount(BiTreeT)

{

if(!

T)return0;

elseif(!

T->lchild&&!

T->lchild)return1;

elsereturnleafcount(T->lchild)+leafcount(T->rchild);

}

voidmain()

{

BiTreeT=NULL;

intp,w,v;

printf("请输入二叉树序列:

\n");

T=CreatBiTree(T);

if(!

T)

printf("该二叉树为空!

\n");

else

{

printf("先序序列如下:

\n");

PreOrderTraverse(T);

printf("\n\n");

printf("中序序列如下:

\n");

InOrderTraverse(T);

printf("\n\n");

printf("后序序列如下:

\n");

LastOrderTraverse(T);

printf("\n\n");

printf("二叉树的深度是:

");

w=height(T);

printf("%d\n",w);

printf("二叉树的叶子节点的数目为:

");

v=leafcount(T);

printf("%d",v);

printf("\n\n");

}

}

 

3、测试数据

ABD000CF00E00

4、测试结果

五、调试与分析

创建二叉树:

依次输入二叉树前先序遍历序列,构建相应的二叉树。

二叉树遍历:

递归算法测试,调用相应函数进行测试,结果正确。

求二叉树深度:

创建一个二叉树,调用相关函数,测试结果正确。

计算结点数目:

调用相关函数,测试结果正确。

六、总结

通过对二叉树的基本操作的学习,熟悉的掌握了二叉树的结构特性,掌握了二叉树的链式存储结构的特点和适用范围,通过二叉树的基本操作实现,思考一般树的基本操作的实现。

熟悉掌握各种遍历各种二叉树的策略的递归和非递归算法。

在对二叉树基本操作的学习过程中不断其

中的算法思想进行改进和修正,更熟悉的掌握关于二叉树的基本操作。

熟练掌握二叉树的结构特性,了解相应的证明方法。

熟悉二叉树的各种存储结构的特点及适用范围。

遍历二叉树是二叉树各种操作的基础。

实现二叉树遍历的具体算法与所采用的存储结构有关。

不仅要熟练掌握各种遍历策略的递归和非速归算法,了解遍历过程中"栈"的作用和状态,而且能灵活运用遍历算法实现二叉树的其它操作。

理解二叉树线索化的实质是建立结点与其在相应序列中的前驱或后继之间的直接联系,熟练掌握二叉树的线索化过程以及在中序线索化树上找给定结点的前驱和后继的方法。

二叉树的线索化过程是基于对二叉树进行遍历,而线索二叉树上的线索又为相应的遍历提供了方便。

熟悉树的各种存储结构及其特点,掌握树和森林与二叉树的转换方法。

建立存储结构是进行其它操作的前提,因此读者应掌握1至2种建立二叉树和树的存储结构的方法。

学会编写实现树的各种操作的算法。

了解最优树的特性,掌握建立最优树和哈夫曼编码的方法。

 理解先序序列和中序序列可唯一确定一棵二叉树的道理,理解具有相同的先序序列而中序序列不同的二叉树的数目与序列1、2……n 按不同顺序进栈和出栈所能得到的排列的数目相等的道理,掌握由前序序列和中序序列建立二叉树的存储结构的

方法。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1