广工数据结构课程设计图书管理系统文档格式.docx
《广工数据结构课程设计图书管理系统文档格式.docx》由会员分享,可在线阅读,更多相关《广工数据结构课程设计图书管理系统文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
新书购入,将书号、书名、著者、册数、出版时间添加入图书账目中去,如果这种书在帐中已有,则只将总库存量增加,每新增一个书号则以凹入表的形式显示B树现状。
②清除库存:
实现某本书的全部信息删除操作,每清除一个书号则已以凹入表的形式显示B树现状。
③图书借阅:
如果书的库存量大于零时则执行出借,登记借阅者的图书证号和姓名,系统自动抓取当前借阅时间和计算归还时间。
④图书归还:
注销借阅者信息,并改变该书的现存量。
⑤显示:
以凹入表的形式显示B树。
这个操作是为了调试和维护的目的而设置的。
⑷测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。
入库书号:
35,16,18,70,5,50,22,60,13,17,12,45,25,42,15,90,30,7
清除书号:
45,90,50,22,42
2.概要设计
(1).抽象数据类型B树定义:
ADTBTree{
数据对象:
D是具有相同特性的数据元素的集合。
各个数据元素均含有类型相同,可惟一标识数据元素的关键字。
数据关系:
数据元素同属于一个集合并且:
一棵m阶的B树,或为空,或为满足下列特性的m叉树:
树中每个结点至多有m棵子树;
若根结点不是叶子结点,则至少有两棵子树;
除根之外的所有非终端结点至少有m/2(取上限)棵子树;
所有的非终端结点包含下列信息数据:
(n,A0,K1,A1,K2,A2,K3,……,Kn,An)
其中:
Ki(i=1,2,……n)为关键字,且Ki<
Ki+1(i=1,2,……n-1);
Ai(i=0,……n)为指向子树根结点的指针,且指针Ai-1所指子树中所有结点的关键字均小于Ki(i=1,2,……n),An所指子树中所有结点的关键字均大于Kn,n(m/2(取上限)-1<
=n<
=m-1)为关键字的个数
基本操作:
CreateBTree(BTree*T)
操作结果:
构建B-树
BTreeSearch(sBTree*T,intk,sBTree*&
x,int&
index)
初始条件:
树T存在,k为和关键字类型相同的给定值。
若B树T中存在关键字等k的数据元素,则返回该元素的值或在表中的位置,否则返回“空”。
BTreeInsert(k)
初始条件:
B树T存在,k为待插入的数据元素。
若T中不存在关键字等于k的数据元素,则插入k到T中。
BTreeDeleteKeywords(sBTree*T,k);
B树T存在,k为和关键字相同的给定值。
若T中存在其关键字等于k的数据元素,则删除之。
BTreeTraverse(BTreeT,Visit)
B树T存在,Visit是对T结点的函数
遍历B树T,对每个结点调用Visit函数
PrintBTree(sBTree*T);
书库T存在。
以凹入表形式显示B树T。
}ADTBTree
(2).图书管理类型定义:
ADTBook{
D={ai|ai∈BookType,i=1,2,3,……n,n>
=0,其中
每个数据元素ai含有类型相同,可惟一标识数据元素的关键字}
数据元素同属一个集合
InsertBook(sBTree*T,sKeywordskeywords)
B树T已存在。
操作结果:
如果所要插入的书中已存在T树中,则只将该书的库存量增加,否则插入到T树中。
Rent(k)
书库不为空。
如果书库中有书号为k的书,则借书成功,否则返回查找失败。
Get(k)
如果书库中有书号为k的书,则还书成功,否则返回查无此书。
}ADTBook
(3)主程序
intmain()
{初始化
系统界面;
do
{switch()
显示菜单信息;
接受命令;
处理命令;
输出结果;
}while
}
3.详细设计
(1)抽象数据类型B-树存储定义:
structsBTree{
intn;
//关键字的计量
sKeywordskeywords[MAX_KEYWORDS];
//关键字的最大容量
boolleaf;
//判断是否为叶子
sBTree*children[MAX_KIDSNUM];
//孩子
};
sBTree*root=NULL;
//根结点
intdeep=0;
//深度
voidCreateBTree();
//构建B树
boolBTreeSearch(sBTree*T,intcount,sBTree*&
index);
//查找关键字
voidBTreeInsert(sKeywordskeywords);
//插入
voidBTreeInsertNonfull(sBTree*x,sKeywordskeywords);
//非满B树的插入
voidBTreeDeleteKeywords(sBTree*x,intcount);
//删除结点
voidBTreeSplitChild(sBTree*parent,inti);
//分裂孩子结点
sBTree*BTreeSplit(sBTree*x,sKeywords&
keywords);
//分裂结点
voidBTreeCombine(sBTree*x,sKeywordskeywords,sBTree*newNode)//结点合并
(2)B-树操作定义
voidCreateBTree()
{//构建B-树
sBTree*newNode=(sBTree*)malloc(sizeof(sBTree));
//分配存储空间
newNode->
leaf=true;
n=0;
root=newNode;
for(inti=0;
i<
MAX_KIDSNUM;
i++)
root->
children[i]=NULL;
boolBTreeSearch(sBTree*T,intcount,sBTree*&
{//查找操作
inti=0;
while(i<
(T->
n)&
&
count>
keywords[i].count))
i++;
if(i<
count==(T->
keywords[i].count)){
x=T;
index=i;
returntrue;
}
if(T->
leaf)
returnfalse;
else
returnBTreeSearch(T->
children[i],count,x,index);
voidBTreeInsert(sKeywordskeywords)
{//插入操作
sBTree*r=root;
if(r->
n==MAX_KEYWORDS){//如果结点B树已满,则分配新的结点
leaf=false;
children[0]=r;
BTreeSplitChild(newNode,0);
BTreeInsertNonfull(newNode,keywords);
BTreeInsertNonfull(r,keywords);
voidBTreeInsertNonfull(sBTree*x,sKeywordskeywords)
{
inti=(x->
n);
while(i>
0&
keywords<
x->
keywords[i-1])
i--;
if(x->
AddKeywordsToLine(x,i,keywords,NULL,true);
else{
if(x->
children[i]->
n==MAX_KEYWORDS){
BTreeSplitChild(x,i);
if(keywords>
keywords[i])
BTreeInsertNonfull(x->
children[i],keywords);
voidBTreeDeleteKeywords(sBTree*x,intcount)
{//删除结点
sKeywordskeywords;
sBTree*newNode;
intindex=-1;
leaf){
BTreeDeleteLeafData(x,count);
elseif(DataInNode(x,count,index)){
if((x->
children[index]->
n)>
MIN_KEYWORDS){
keywords=MaxKeywords(x->
children[index]);
x->
keywords[index]=keywords;
BTreeDeleteKeywords(x->
children[index],keywords.count);
elseif((x->
children[index+1]->
keywords=MinKeywords(x->
children[index+1]);
children[index+1],keywords.count);
newNode=RemoveKeywordsFromLine(x,index,keywords,false);
BTreeCombine(x->
children[index],keywords,newNode);
children[index],count);
for(index=0;
index<
n;
index++){
if(count<
keywords[index].count)
break;
n==MIN_KEYWORDS){
if(index>
(x->
children[index-1