数据结构课设说明书.docx
《数据结构课设说明书.docx》由会员分享,可在线阅读,更多相关《数据结构课设说明书.docx(38页珍藏版)》请在冰豆网上搜索。
数据结构课设说明书
《数据结构与算法》
课程设计说明书
题目:
红黑树的实现及其应用
学院:
计算机科学与工程学院
专业:
姓名:
学号:
指导教师:
2014年10月20日
目录
引言3
摘要4
1问题描述5
2、基本要求5
2.1开发环境5
3需求分析5
3.1系统总体功能需求5
3.1.1查询模块分析图6
3.1.3删除模块分析图6
3.2图书管理系统的流程分析7
3.2.1删除图书流程图7
3.2.2查询模块流程图8
3.2.3插入流程图8
4.概要设计8
5.详细设计9
5.1图书的节点类9
5.2图书管理系统的二叉树类11
5.3图书管理系统的二叉查找树类12
5.4图书管理系统的红黑树类15
5.5主函数的设计22
6.运行与调试23
7系统特色及关键技术24
7.1插入与双红调整24
7.2删除与 双黑修正25
8.总结与心得26
参考资料:
29
引言
随着社会信息量的与日俱增,作为信息存储的主要媒体之一图书,数量、规模比以往任何时候都大的多,不论个人还是图书管理部门都需要使用方便而有效的方式来管理自己的书籍。
在计算机日益普及的今天,对个人而言若采用一套行之有效的图书管理系统来管理自己的书籍,会方便许多。
对图书管理部门而言,以前单一的手工检索已不能满足人们的要求,为了便于图书资料的管理需要有效的图书管理软件。
计算机网络近年来获得飞速的发展,十年前,很少有人接触过网络。
如今,计算机网络已经成为我们社会结构的一个基本组成部分。
网络已被应用到人类生活的各个方面,人们通过网络通信,共享资源,网上超市、电子银行等也应运而生,各种提供不同特色,不同内容的网站如雨后春笋般涌现。
计算机网络的发展为人们打开了一种新的视野,促成了一个新领域新产业的产生。
网络的发展试图用一种全新的概念冲击各个传统的商业模式,改变人们的生活方式。
新的需求产生了,人们想通过网络进行个人通信、媒体传播、商业运作、办公、教学等。
总之网络技术的发展促进了社会经济结构的变革。
反之,社会经济对网络发展提出的新的需求又大大的促进了网络的发展,计算机网络及其所涉及的一系列技术成为计算机领域新的研究热点。
在计算机日益普及的今天,对个人而言若采用一套行之有效的图书管理系统来管理自己的书籍,会方便许多。
对图书管理部门而言,以前单一的手工检索已不能满足人们的要求,为了便于图书资料的管理需要有效的图书管理软件。
该软件采用功能强大的数据库软件开发工具进行开发,具有很好的可移植性,可在应用范围较广的
WINDOWS系列等操作系统上使用。
除此以外,图书馆管理系统已成为方便了广大师生、学校与外界之间的沟通架起了一座桥梁。
但是,这并不能满足目前师生的需要。
比如一些特定的需要要,在管理方面特别不方便,因为它受到地域的限制太大。
就目前情况而言,急需充分利用网络方式的图书管理。
我们的网络图书馆管理系统就是为了解决这问题而设计的。
摘要
随着高等院校规模的不断扩大,随着人类社会的发展,人们对知识的需求也在不断地增长,高校图书馆的藏书数量也就越来越多,图书管理涉及到大量的数据处理,一个现在化的图书馆根本不可能手工完成的庞大的数据处理。
在这种形势下,图书管理的计算机化也成为了一件比较重要的事情,如何提高图书的查询能力这成为了人们比较关心的问题。
在图书管理系统中,当图书的数量非常大时,那么查找效率就会明显变低,此时采用一些优化手段就非常必要。
采用红黑树这种数据结构可以提高系统性能。
该课程设计鉴于管理系统的不断发展,为了减轻人工操作管理图书的负担,提高高校图书管理工作的效率。
由于水平有限,论文中难免存在错误和不足之处,敬请各位批评和指正。
关键字:
图书管理红黑树查询删除插入
1问题描述
在图书管理系统中,当图书的数量非常大时,那么查找效率就会明显变低,此时采用一些优化手段就非常必要。
采用红黑树这种数据结构来提高系统性能。
在此系统中,首先,会将所有的图书信息载入,生成一个红黑树,其成绩为查找索引;当插入/删除图书信息时,会向树中加入/删去一个节点,并且会根据红黑树规则进入树的更新;当进行查找时,
会以图书编号为索引,进行查找。
因为红黑树的查找效率高,所以此方法可以提高系统性能。
2、基本要求
(1)实现红黑树数据结构
(2)会将所有的图书信息载入,生成一个红黑树,其成绩为查找索引;
(3)当插入/删除成绩信息时,会向树中加入/删去一个节点,并且会根据红黑树规则进入树的更新。
更高要求:
(4)将红黑树的操作封装为DLL
(5)当图书的数据量很大时,与二叉排序树和AVL树的性能进行对比
(6)UI设计与实现
2.1开发环境
项目名称:
图书管理系统设计与实现。
软件环境:
本程序采用vs2010开发的。
[1]visualstudio是微软公司推出的开发环境。
是目前最流行的windows平台应用程序开发环境。
VisualStudio2010版本于2010年4月12日上市,其集成开发环境(IDE)的界面被重新设计和组织,变得更加简单明了。
VisualStudio2010同时带来了NETFramework4.0、MicrosoftVisualStudio2010CTP(CommunityTechnologyPreview--CTP),并且支持开发面向Windows7的应用程序。
除了MicrosoftSQLServer,它还支持 IBM DB2和Oracle数据库。
学习版(Express):
VisualStudio2010(Express)是一个免费工具。
它从VisualStudio产品线,提供了新的集成开发环境,vs2010一个新的编辑器内建在WindowsPresentationFoundation(WPF)和新的支持像爱好者非专业开发人员。
NETFramework的四集,学生和新手开发谁想要构建动态Windows应用程序,网站和网络服务
硬件环境:
优雅A460-i3D6+2G内存+320G硬盘+Intelcorei3380M2.53G32nm双核处理器+百兆局域网开发工具:
Microsoftvisual2010
3需求分析
3.1系统总体功能需求
立足于校园实际,着眼于未来发展,建成符合标准化协议、通用性较强、实用的系统,以提高图书信息的现代化管理水平,实现信息资源的共享。
图书管理系统是一种基于集中统一规划数据管理新模式。
在对图书的管理,其实是对图书数据的管理。
本系统的建成无疑会为管理者对图书管理系统提供极大的帮助。
使用该系统之后,可以代替手工的将图书入库、删除、查询。
本系统的宗旨是提高图书管理工作的效率,减少相关人员的工作量,使学校的图书管理工作真正做到科学、合理的规划,系统、高效的实施。
产品功能:
图书的查询管理、图书的删除管理、图书的插入管理。
3.1.1查询模块分析图
输入图书编号如果有书,则输出该书的信息,没书则输出没书提醒信息
图3-1-1
3.1.2插入模块分析图
输入图书的信息包括编号、名称、位置、数量。
查找图书,看图书的是不是已经存在,存在返回该节点。
否则的话,把节点插入到树的最后一个访问过的节点。
图3-1-2
3.1.3删除模块分析图
图3-1-3
3.2图书管理系统的流程分析
3.2.1删除图书流程图
找不到找到
图3-2-1
3.2.2查询模块流程图
找不到找到
图3-2-2
3.2.3插入流程图
找不到找到
图3-2-3
4.概要设计
1.本程序主要是采用红黑树数据结构。
红黑树可以提高检索的性能。
2.本程序分为三个模块:
第一个模块是插入,主要完成的是红黑树的建立,也就是图书的建立功能,对应的函数接口是insert(charnum[],charname[],charposition[],intcount)。
第二个模块式删除,主要完成的功能是图书的删除功能remove(charnum[])。
第三个模块就是查询,主要完成的是图书的查询search(charnum[]).
3.伪代码:
插入:
查找目标节点search(num);
如果目标节点已经存在if(v)
则返回该节点returnv;
否则以当前节点为父节点往红黑树中插入,RB_NodePx=v=newRB_BookNode(num,name,position,count,_hot);
更新全树的规模
维护红黑树的特征。
删除:
按编号寻找删除目标search(num)
找不到删除失败,返回
找到将被删除节点的接替者与最后访问的一个节点相连
实施删除
更新黑高,双黑调整,返回true
查找:
输入编号,按编号查找
如果找到。
输出节点信息并返回该节点;
5.详细设计
5.1图书的节点类
图书的节点类的数据成员包含有书的编号、书的名称、书的位置、书的数量、父亲节点、左孩子、右孩子、树高、树的节点的颜色。
成员函数有构造函数和析构函数、取得节点的前驱函数、对“<”的运算符的重载。
具体图书的节点类的声明如下:
classRB_BookNode
{
public:
charnum[30];
charname[30];
charposition[30];
intcount;
RB_NodePparent;
RB_NodePlchild;
RB_NodePrchild;
intheight;
RBcolorcolor;
booloperator<(RB_BookNodeconst&bn);
RB_NodePsucc();
RB_BookNode(void);
RB_BookNode(charn[],charna[],charp[],intc,RB_NodePprt=NULL,RB_NodePlc=NULL,RB_NodePrc=NULL,inth=0,RBcolorclor=RB_Red);
~RB_BookNode(void);
};
图书节点类的实现如下:
boolRB_BookNode:
:
operator<(RB_BookNodeconst&bn)
{
returnnum}
RB_BookNode:
:
RB_BookNode(void)
{
parent=NULL;lchild=NULL;rchild=NULL;height=0;color=RB_Red;
}
RB_BookNode:
:
RB_BookNode(charn[],charna[],charp[],intc,RB_NodePprt,RB_NodePlc,RB_NodePrc,inth,RBcolorclor)
{
//intlen=n.length();intlen1=na.length();intlen2=p.length();
num[30]=n[30];name[30]=na[30];position[30]=p[30];count=c;
parent=prt;lchild=lc;rchild=rc;
height=h;color=clor;
}
RB_NodePRB_BookNode:
:
succ(){//定位节点v的直接后继
RB_NodePs=this;//记录后继的临时变量
if(rchild){//若有右孩子,则直接后继必在右子树中,具体地就是
s=rchild;//右子树中
while(Haslchild(*s))s=s->lchild;//最靠左(最小)的节点
}else{//否则,直接后继应是“将当前节点包含于其左子树中的最低祖先”,具体地就是
while(Isrchild(*s))s=s->parent;//逆向地沿右向分支,不断朝左上方移动
s=s->parent;//最后再朝右上方移动一步,即抵达直接后继(如果存在)
}
returns;
}
5.2图书管理系统的二叉树类
该类主要是为黑红树类做铺垫的,它的数据成员有全树的规模_size、二叉树的树根_root,成员函数有调整一个节点的高度的函数updateHeight(RB_NodeP)、调整整棵树高度的函数updateheightAbove(RB_NodePx)、还有比较两个整数大小的函数用来max(inta,intb).
二叉树类的声明代码如下:
classRB_BookTree:
publicRB_BookNode
{
public:
int_size;
RB_NodeP_root;
virtualintupdateHeight(RB_NodeP);
voidupdateHeightAbove(RB_NodePx);
intmax(inta,intb);
RB_BookTree(void);
};
二叉树的实现代码如下:
RB_BookTree:
:
RB_BookTree(void)
{
_size=0;
_root=NULL;
}
intRB_BookTree:
:
max(inta,intb)
{
returna>b?
a:
b;
}
intRB_BookTree:
:
updateHeight(RB_NodePx)
{
returnx->height=1+max(stature(x->lchild),stature(x->rchild));
}
voidRB_BookTree:
:
updateHeightAbove(RB_NodePx)
{
while(x)
{
updateHeight(x);
x=x->parent;
}
}
5.3图书管理系统的二叉查找树类
该类也是为了红黑树的实现做准备的。
二叉查找树继承了二叉树类的数据成员主要有_hot最后访问的节点指针、成员函数主要有RB_NodeProtateAt(RB_NodePx);对x的父亲和祖父做旋转调整。
和对树的节点的查找函数virtualRB_NodeP&search(charn[]);按编号查找、负责按情况实施删除的操作函数staticRB_NodePremoveAt(RB_NodeP&v,RB_NodeP&hot)按照“3+4”结构联结三个节点及其四棵子树RB_NodePconnect34(RB_NodeP,RB_NodeP,RB_NodeP,RB_NodeP,RB_NodeP,RB_NodeP,RB_NodeP);
classBST:
publicRB_BookTree
{
protected:
RB_NodeP_hot;//最后访问的节点指针
RB_NodeProtateAt(RB_NodePx);//对x的父亲和祖父做旋转调整
RB_NodePconnect34(RB_NodeP,RB_NodeP,RB_NodeP,RB_NodeP,RB_NodeP,RB_NodeP,RB_NodeP);
public:
virtualRB_NodeP&search(charn[]);//按编号查找******
staticRB_NodePremoveAt(RB_NodeP&v,RB_NodeP&hot)
{
RB_NodePw=v;//实际被删除的节点,初值同V
RB_NodePsucc=NULL;//实际被删除节点的接替者
if(!
Haslchild(*v))//若*v的左子树为空,则可直接将*v替换为右子树
succ=v=v->rchild;
else
{
w=w->succ();//找到*V的后继*w
chartemp[30];//交换数据域
temp[30]=(v->num[30]);
v->num[30]=w->num[30];
w->num[30]=temp[30];
temp[30]=v->name[30];
v->name[30]=w->name[30];
w->name[30]=temp[30];
temp[30]=v->position[30];
v->position[30]=w->position[30];
w->position[30]=temp[30];
inttp;
tp=v->count;
v->count=w->count;
w->count=tp;
}
returnsucc;
}
BST();
};
二叉查找树类的代码实现如下:
staticRB_NodeP&searchIn(RB_NodeP&v,charnum[],RB_NodeP&hot)//e为编号,按编号查找
{
if(!
v||(strcmp(num,v->num)==0))
{
cout<<"t图书为"<num<<""<name<<""<position<<""<count<<"\n";
returnv;
}
hot=v;
returnsearchIn(((strcmp(num,v->num)<0)?
v->lchild:
v->rchild),num,hot);}
RB_NodeP&BST:
:
search(charnum[])
{
returnsearchIn(_root,num,_hot=NULL);
}
RB_NodePBST:
:
rotateAt(RB_NodePx)//对x的父亲和祖父做旋转调整
{
RB_NodePp=x->parent;
RB_NodePg=p->parent;//grandfather
if(Islchild(*p))
if(Islchild(*p))//zig
{
p->parent=g->parent;
returnconnect34(x,p,g,x->lchild,x->rchild,p->rchild,g->rchild);
}
else
{
x->parent=g->parent;
returnconnect34(p,x,g,p->lchild,x->lchild,x->rchild,g->rchild);
}
else
if(Isrchild(*x))
{
p->parent=g->parent;
returnconnect34(g,p,x,g->lchild,p->lchild,x->lchild,x->rchild);
}
else
{
x->parent=g->parent;
returnconnect34(g,x,p,g->lchild,x->lchild,x->rchild,p->rchild);
}
}
RB_NodePBST:
:
connect34(RB_NodePa,RB_NodePb,RB_NodePc,
RB_NodePT0,RB_NodePT1,RB_NodePT2,RB_NodePT3)
{
a->lchild=T0;if(T0)T0->parent=a;
a->rchild=T1;if(T1)T1->parent=a;
updateHeight(a);//这个好像要重载
b->lchild=a;a->parent=c;
b->rchild=c;c->parent=c;
updateHeight(c);
b->lchild=a;a->parent=b;
b->rchild=c;c->parent=b;
updateHeight(b);
returnb;
}
5.4图书管理系统的红黑树类
红黑树继承了图书节点类、二叉树类、二叉查找树类。
它的主要的成员函数有,双黑调整函数voidsolveDoubleRed(RB_NodePx);负责当节点删除时进行对红黑树的维护、和双红调整函数voidsolveDoubleBlack(RB_NodePx);负责当插入节点时进行对红黑树性质的维护。
还有对红黑树的高度进行更新的函数virtualintupdateHeight(RB_NodePx);
classRedBlack_Tree:
publicBST
{
protected:
voidsolveDoubleRed(RB_NodePx);
voidsolveDoubleBlack(RB_NodePx);
virtualintupdateHeight(RB_NodePx);
public:
virtualRB_NodePinsert(charnum[],charname[],charposition[],intcount);
virtualboolremove(charnum[]);//按编号删除
voidsaveToFile();
voidloadFromFile();
friendofstream&operator<<(ofstream&out,RedBlack_Tree&nd);
friendifstream&operator>>(ifstream&t_stream,RedBlack_Tree&rb);
voidorder(RB_NodePt);
voidtravPre_I1(RB_NodeP);
RB_NodeProot();
RedBlack_Tree(void);
~RedBlack_Tree(void);
};
红黑树类的实现代码如下:
#defineBlackHeightUpated(x)((stature((x).lchild)==stature((x).rchild))&&((x).height==(Isred(&x)?
stature((x).lchild):
stature((x).lchild)+1))//RB高度更新条件
/****************************************************************************
*插入函数:
在RedBlack树中插入关键码由四部分构成的节点:
图书编号、图书名称、图书位置、图书数量。
返回新节点的位置(以编号为索引,若在原树中已存在的关键编号,虽不重新插入,但也返回该节点位置)
******************************************************