夏媛数据结构课程设计报告.docx
- 文档编号:27696864
- 上传时间:2023-07-04
- 格式:DOCX
- 页数:17
- 大小:237.23KB
夏媛数据结构课程设计报告.docx
《夏媛数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《夏媛数据结构课程设计报告.docx(17页珍藏版)》请在冰豆网上搜索。
夏媛数据结构课程设计报告
沈阳航空航天大学
课程设计报告
课程设计名称:
数据结构课程设计
课程设计题目:
带父亲节点的平衡二叉树的建立
院(系):
计算机学院
专业:
网络工程
班级:
学号:
姓名:
夏媛
指导教师:
郑志勇
目录
1课程设计介绍1
1.1课程设计内容1
1.2课程设计要求1
2课程设计原理2
2.1课设题目粗略分析2
2.2原理图介绍2
2.2.1功能模块图2
2.2.2流程图分析3
3数据结构分析8
3.1存储结构8
3.2算法描述8
4调试与分析10
4.1调试过程10
4.1程序执行过程11
参考文献12
附录(关键部分程序清单)13
1课程设计介绍
1.1课程设计内容
设计程序,建立带有父亲结点的平衡二叉树,系统主要功能是:
从键盘上输入一整数序列,建立一颗平衡二叉树。
1.2课程设计要求
(1)要能够形象方便的观察树的结构;
(2)要能够形象的演示树的平衡过程;
(3)课程设计报告必须符合课程设计报告规范;
(4)提交合格的报告后,经指导老师测试程序后,课设完成。
2课程设计原理
2.1课设题目粗略分析
根据课设题目要求,我将整体程序分为四大模块,这四个模块相互独立,没有任何嵌套调用的情况,以下是四个模块的大体分析:
(1)判断模块:
在插入一个关键字时,首先先对该关键字进行判断,如果该关键字已经存在则不插入,否则插入该关键字,调用函数InsertAVL()。
(2)左子树插入模块:
如果判断完的新关键字插在左子树上,则对该以指针p所指结点为根的二叉树作左平衡旋转处理,本算法结束时,指针p指向新的根结点,调用函数LeftProcess()。
(3)右子树插入模块:
如果判断完的新关键字插在右子树上,则对该以指针p所指结点为根的二叉树作右平衡旋转处理,本算法结束时,指针p指向新的根结点,调用函数RightProcess()。
(4)输出模块:
对建立完成的平衡二叉树输出,输出格式为二叉树的括号表示,且每一步插入操作对应一次输出,最后做一次总体输出,调用函数,DispBSTree()。
2.2原理图介绍
主函数主要实现的功能是函数调用,主函数首先对输入的关键字进行判断,调用函数InsertAVL(),若该关键字在已建树中已经存在,则返回主函数接着对下一个关键字进行判断。
若该关键字在已建树中不存在,则插入该数,若插入左子树中则调用函数LeftProcess()进行插入操作,若插入右子树中则调用函数DispBSTree()进行插入操作。
当所有的关键字都插入完事之后,进行输出,调用函数,DispBSTree()。
2.2.1功能模块图
1.判断模块
若在平衡二叉排序树b中不存在和e有相同关键字的结点,则插入一个数据元素为e的新结点,并返回1,否则返回0。
若因插入而使二叉排序树失去平衡,则作平衡旋转处理,布尔变量taller反映b长高与否。
2.左子树插入模块
对以指针p所指结点为根的二叉树作左平衡旋转处理,本算法结束时,指针p指向新的根结点,插入分三种情况:
原本左右子树等高,现因左子树增高而使树增;原本右子树比左子树高,现左右子树等高;原本左子树比右子树高,须作左子树的平衡处理。
若新关键字插入在*p的左孩子的左子树上,要做LL调整,若新关键字插入在*p的左孩子的右子树上,要做LR调整。
3.右子树子树插入模块
对以指针p所指结点为根的二叉树作右平衡旋转处理,本算法结束时,指针p指向新的根结点,插入分三种情况:
原本左右子树等高,现因右子树增高而使树增;原本左子树比右子树高,现左右子树等高;原本右子树比左子树高,须作右子树的平衡处理。
若新关键字插入在*p的右孩子的右子树上,要做RR调整,若新关键字插入在*p的右孩子的左子树上,要做RL调整。
2.2.2流程图分析
1.主函数流程图
主函数主要实现的功能是函数调用,主函数首先对输入的关键字进行判断,若该关键字在已建树中已经存在,则返回主函数接着对下一个关键字进行判断。
若该关键字在已建树中不存在,则插入该数,当所有的关键字都插入完事之后,进行输出。
流程图如图2.1所示。
图2.1主函数流程图
2.判断模块流程图
若在平衡二叉排序树b中不存在和e有相同关键字的结点,则插入一个数据元素为e的新结点,并返回1,否则返回0。
若因插入而使二叉排序树失去平衡,则作平衡旋转处理,布尔变量taller反映b长高与否。
流程图如图2.2所示。
图2.2判断模块流程图
3.左子树插入模块流程图
断完的新关键字插在左子树上,则对该以指针p所指结点为根的二叉树作左平衡旋转处理,本算法结束时,指针p指向新的根结针。
流程图如图2.3所示。
图2.3左子树插入模块流程图
4.右子树插入模块流程图
断完的新关键字插在右子树上,则对该以指针p所指结点为根的二叉树作右平衡旋转处理,本算法结束时,指针p指向新的根结针。
流程图如图2.4所示。
图2.4右子树插入模块流程图
3数据结构分析
3.1存储结构
定义一个关键字类型的字符数组,其空间足够大,用来存放关键字。
3.2算法描述
1.判断关键字算法如下:
{//若在平衡二叉排序树b中不存在和e有相同关键字的结点,则插入一个数据元素为e的新结点,
if(b==NULL)//原树为空,插入新结点,树长高,置taller为1
{b=(BSTNode*)malloc(sizeof(BSTNode));
b->key=e;
b->lchild=b->rchild=NULL;
b->bf=0;
taller=1;}
else
{if(e==b->key)//树中已存在和e有相同关键字的结点则不插入
{taller=0;
return0;}
if(e
{if((InsertAVL(b->lchild,e,taller))==0)//未插入
return0;
if(taller==1)//已插入到*b的左子树中且左子树长高
LeftProcess(b,taller);}
else//继续在*b的右子树中进行搜索
{if((InsertAVL(b->rchild,e,taller))==0)//未插入
return0;
if(taller==1)//已插入到*b的右子树中且右子树长高
RightProcess(b,taller);}}
return1;}
2.左平衡处理算法如下:
{//对以指针p所指结点为根的二叉树作左平衡旋转处理,本算法结束时,
//指针p指向新的根结点
BSTNode*p1,*p2;
if(p->bf==0)//原本左右子树等高,现因左子树增高而使树增高
{p->bf=1;
taller=1;}
elseif(p->bf==-1)//原本右子树比左子树高,现左右子树等高
{p->bf=0;
taller=0;}
else//原本左子树比右子树高,须作左子树的平衡处理
{p1=p->lchild;//p指向*p的左子树根节点
if(p1->bf==1)//新结点插入在*p的左孩子的左子树上,要做LL调整
{p->lchild=p1->rchild;
p1->rchild=p;
p->bf=p1->bf=0;
p=p1;}
elseif(p1->bf==-1)//新结点插入在*p的左孩子的右子树上,要做LR调整
{p2=p1->rchild;
p1->rchild=p2->lchild;
p2->lchild=p1;
p->lchild=p2->rchild;
p2->rchild=p;
if(p2->bf==0)//新结点插入在*p2处作为叶子结点的情况
p->bf=p1->bf=0;
elseif(p2->bf==1)/新结点插在*p2的左子树上的情况
{p1->bf=0;
p->bf=-1;}
else//新结点插在*p2的右子树上的情况
{p1->bf=1;
p->bf=0;}
p=p2;
p->bf=0;//仍将p指向新的根结点,并置其bf值为0
taller=0;}
}
4调试与分析
4.1调试过程
在调试程序是主要遇到一下几类问题:
1.本程序用到指针的地方特别多,由于指针那部分知识我掌握的不是很好,故而在这方面有困难。
后来我通过在图书馆查资料、看书解决了这方面问题。
2.对二叉树的左右子树进行插入调整的操作时,由于考虑问题不够全面而导致输出结果出现错误,在查质料重新学习二叉树后,解决了此问题。
4.1程序执行过程
图4.1第一组输入执行结果
图4.2第二组输入执行结果
参考文献
[1]严蔚敏.吴伟民.数据结构[M].北京:
清华大学出版社,2007.
[2]张长海.陈娟.C程序设计[M].北京:
高等教育出版社,2004.
[3]谭浩强.C程序设计[M].北京:
清华大学出版社,2005.
[4]徐孝凯.数据结构实用教程.[M].北京:
清华大学出版社,2006.
[5]张秉权.数据结构(C语言描述).[M].北京:
中国轻工业出版社,2004.
附录(关键部分程序清单)
程序代码
#include
#include
typedefintKeyType
typedefstructnode
{KeyTypekey;
intbf;
structnode*lchild,*rchild;
}BSTNode;
voidLeftProcess(BSTNode*&p,int&taller)
{/*对以指针p所指结点为根的二叉树作左平衡旋转处理,本算法结束时指针p指向新结点*/
BSTNode*p1,*p2;
if(p->bf==0)
{p->bf=1;
taller=1;
}
elseif(p->bf==-1)
{p->bf=0;
taller=0;
}
else
{p1=p->lchild
if(p1->bf==1)
{p->lchild=p1->rchild;
p1->rchild=p;
p->bf=p1->bf=0;
p=p1;
}
elseif(p1->bf==-1)
{p2=p1->rchild;
p1->rchild=p2->lchild;
p2->lchild=p1;
p->lchild=p2->rchild;
p2->rchild=p;
if(p2->bf==0)
p->bf=p1->bf=0;
elseif(p2->bf==1)
{p1->bf=0;
p->bf=-1;
}
else
{p1->bf=1;
p->bf=0;
}
p=p2;
p->bf=0;
}
taller=0;
}
}
voidRightProcess(BSTNode*&p,int&taller)
{/*对以指针p所指结点为根的二叉树作右平衡旋转处理,本算法结束时,指针p指向新的根结点*/
BSTNode*p1,*p2;
if(p->bf==0)
{p->bf=-1;
taller=1;
}
elseif(p->bf==1)
{p->bf=0;
taller=0;
}
else
{p1=p->rchild;
if(p1->bf==-1)
{p->rchild=p1->lchild;
p1->lchild=p;
p->bf=p1->bf=0;
p=p1;
}
elseif(p1->bf==1)
{p2=p1->lchild;
p1->lchild=p2->rchild;
p2->rchild=p1;
p->rchild=p2->lchild;
p2->lchild=p;
if(p2->bf==0)
p->bf=p1->bf=0;
elseif(p2->bf==-1)
{p1->bf=0;
p->bf=1;
}
else
{p1->bf=-1;
p->bf=0;
}
p=p2;
p->bf=0;
taller=0;
}
}
intInsertAVL(BSTNode*&b,KeyTypee,int&taller)
{/*若在平衡二叉排序树b中不存在和e有相同关键字的结点,则插入一个数据元素为e的新结点,并返回1,否则返回0。
若因插入而使二叉排序树失去平衡,则作平衡旋转处理,布尔变taller
反映b长高与否*/
if(b==NULL)
{b=(BSTNode*)malloc(sizeof(BSTNode));
b->key=e;
b->lchild=b->rchild=NULL;
b->bf=0;
taller=1;
}
else
{if(e==b->key)
{taller=0;
return0;
}
if(e
{if((InsertAVL(b->lchild,e,taller))==0)
return0;
if(taller==1)
LeftProcess(b,taller);
}
else
{if((InsertAVL(b->rchild,e,taller))==0)
return0;
if(taller==1)
RightProcess(b,taller);
}
}
return1;
}
voidDispBSTree(BSTNode*b)
{/*以括号表示法输出AVL*/
if(b!
=NULL)
{printf("%d",b->key);
if(b->lchild!
=NULL||b->rchild!
=NULL)
{printf("(");
DispBSTree(b->lchild);
if(b->rchild!
=NULL)printf(",");
DispBSTree(b->rchild);
printf(")");
}
}
}
intmain()
{
BSTNode*b=NULL;
inti,j;
KeyTypea[]={6,1,2,3,4,5,0,7,8,9},n=10;
printf("创建一棵AVL树:
\n");
for(i=0;i {printf("第%d步,插入%d元素: ",i+1,a[i]); InsertAVL(b,a[i],j); DispBSTree(b); printf("\n"); } printf("AVL: "); DispBSTree(b); printf("\n"); return0; } 课程设计总结: 本次课程设计的完满成功,是我认识到自己的不足,不仅是对知识的不足还有我个人性格的不足。 对此,谢谢郑志勇老师的认真指导,我会在以后的学习中好好学习、正确学习,真正的是自己学到知识。 本次课程设计,巩固了以前学过的C语言的知识,在这次课程设计中我体 会到C语言超强的逻辑性,能够熟练使用VC++的编译环境,也对这两门课程有了新的认识,他们既有联系,又相互区别,在编写程序过程中要灵活应用。 对数据结构的理解有待加强,算法的知识面也有待于提高。 不同的人会选择不同的算法,所以即使同样的程序,不同的人必然会设计出不同的方案,所以以后的学习生活中,一定要广泛涉猎,掌握更多更好的解决问题的方法。 通过这次的课程设计使我了解到,只掌握理论的知识是不够的,课堂上的知识仅仅是理论,并且书本太狭隘,我们以后的学习不应该再局限于书本,必须要把理论和实际相结合起来,得让所学的知识能在实际当中应用才是做到了学以致用,才能把所学的东西具体化,体现出知识的重要。 并且,只有做到了学以致用,才能让我们对知识有更进一步的了解,才能更好的掌握知识。 通过这次的课程设计使我积累了很多的经验,同时也让我了解到了自己在学习上的不足,通过以后的学习来弥补这些不足。 1. 指导教师评语: 指导教师(签字): 年月日 课程设计成绩
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告