用B树做的图书管理系统Word文档格式.docx
《用B树做的图书管理系统Word文档格式.docx》由会员分享,可在线阅读,更多相关《用B树做的图书管理系统Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
voidShowBTNode(BTreep);
voiddisplay(BTreeT);
voidKeyTypeCopy(KeyType&
bak,KeyTypek);
intSearch(BTreep,KeyTypeK);
ResultSearchBTree(BTreeT,KeyTypeK);
voidInsert(BTree&
q,inti,KeyTypex,BTreeap);
voidsplit(BTree&
q,ints,BTree&
ap);
voidNewRoot(BTree&
T,BTreep,KeyTypex,BTreeap);
StatusInsertBTree(BTree&
T,KeyTypeK);
StatusBorrowBook(BTreeT,KeyTypek);
StatusReturnBook(BTreeT,KeyTypek);
voidsave(BTreep);
/*************************************************/
voidsave(BTreep)//保存文件
{
FILE*fp;
if((fp=fopen("
book.txt"
"
wb"
))==NULL)
{
printf("
创建文件失败!
\n\n"
);
getchar();
return;
}
for(inti=1;
i<
=p->
keynum;
i++){
fprintf(fp,"
%d%s%s%d%d\n"
p->
key[i].key,p->
key[i].bname,p->
key[i].writter,p->
key[i].left,p->
key[i].total);
}
fclose(fp);
}
//读取文件
voidread()
FILE*fp,fp1;
rb"
))==NULL&
&
(fp=fopen("
user.txt"
读取文件失败!
for(inti=1;
;
i++)
{
if(fscanf(fp,"
%d%s%s%d%d"
&
b[i].key,&
b[i].bname,&
b[i].writter,&
b[i].left,&
b[i].total)==EOF)
{break;
InsertBTree(root,b[i]);
}
fclose(fp);
//复制结点,将某个结点的值复制到另外一个值上
bak,KeyTypek){
bak.key=k.key;
strcpy(bak.bname,k.bname);
bak.left=k.left;
bak.total=k.total;
strcpy(bak.writter,k.writter);
//在一个结点中查找元素,返回结点的位置
intSearch(BTreep,KeyTypeK){
if(!
p)
return-1;
inti=0;
for(i=0;
p->
keynum&
key[i+1].key<
=K.key;
i++);
returni;
//在m阶B树T上查找关键字K,返回结果(pt,i,tag)
ResultSearchBTree(BTreeT,KeyTypeK){
BTreep,q;
intfound,i;
ResultR;
p=T;
q=NULL;
found=FALSE;
i=0;
while(p&
!
found){
i=Search(p,K);
if(i>
0&
key[i].key==K.key)
found=TRUE;
else{
q=p;
p=p->
ptr[i];
if(found){
R.pt=p;
R.i=i;
R.tag=1;
R.pt=q;
R.tag=0;
returnR;
//插入一条记录
q,inti,KeyTypex,BTreeap){
intn=q->
for(intj=n;
j>
i;
j--){
KeyTypeCopy(q->
key[j+1],q->
key[j]);
q->
ptr[j+1]=q->
ptr[j];
KeyTypeCopy(q->
key[i+1],x);
q->
ptr[i+1]=ap;
if(ap)
ap->
parent=q;
keynum++;
//分离结点
ap){
inti,j,n=q->
ap=(BTree)malloc(sizeof(BTNode));
ap->
ptr[0]=q->
ptr[s];
for(i=s+1,j=1;
=n;
i++,j++){
KeyTypeCopy(ap->
key[j],q->
key[i]);
ptr[j]=q->
keynum=n-s;
parent=q->
parent;
=n-s;
if(ap->
ptr[i])
ptr[i]->
parent=ap;
q->
keynum=s-1;
//生成一个新的树结点
T,BTreep,KeyTypex,BTreeap){
T=(BTree)malloc(sizeof(BTNode));
T->
keynum=1;
//设置当前结点的元素个数
ptr[0]=p;
//设置左边结点的树根
ptr[1]=ap;
//设置右边的树根
KeyTypeCopy(T->
key[1],x);
//将x元素的结点值复制到T的第一个元素中
if(p)//当孩子不空的时候就设置当前结点为孩子的双亲
p->
parent=T;
if(ap)
ap->
parent=NULL;
//当前结点的双亲为空
voidShowBTNode(BTreep){
printf("
\t"
书号为:
%d"
key[i].key);
书名为:
%5s"
key[i].bname);
作者为:
key[i].writter);
剩余量为:
%5d"
key[i].left);
总量为:
\n"
T,KeyTypeK){
//在m阶B树T上结点*q的key[i]与key[i+1]之间插入关键字K。
BTreeap;
Resultrs;
BTreeq;
inti;
charaddnum;
intfinished,needNewRoot,s;
KeyTypex;
if(!
T){
NewRoot(T,NULL,K,NULL);
rs=SearchBTree(T,K);
//查找元素k在树中的位置
q=rs.pt;
i=rs.i;
if(rs.tag==1){
if(strcmp(q->
key[i].bname,K.bname)!
=0){
printf("
\n\t录入失败,原因:
.\t书号冲突,请重新为该书编号!
\t已经存在书号为%d的书为:
q->
ShowBookMess(q->
returnFALSE;
else
{
\n\t该书已经存在!
\t是否增加其总量(y/n):
"
scanf("
%s"
addnum);
if(addnum=='
Y'
||addnum=='
y'
){
q->
key[i].total+=K.total;
key[i].left+=K.left;
\n\t增加总量后该书的信息如下\n"
}
else{
\n\t该书的信息如下:
ShowBookMess(q->
returnFALSE;
x=K;
ap=NULL;
finished=needNewRoot=FALSE;
while(!
needNewRoot&
finished){
Insert(q,i,x,ap);
//插入结点
if(q->
keynum<
m)
finished=TRUE;
//插入完成
else{//分裂结点*q
s=(m+1)/2;
split(q,s,ap);
x=q->
key[s];
parent){//在双亲结点*q中查找x的插入位置
q=q->
i=Search(q,x);
needNewRoot=TRUE;
if(needNewRoot)
NewRoot(T,q,x,ap);
//生成新根结点*T,q和ap为子树指针
returnOK;
//输入书的具体信息
book){
chars[5];
\t请输入书号:
scanf("
s);
book.key=atoi(s);
\t请输入书名:
book.bname);
\t请输入作者:
book.writter);
\t请输入总量:
book.total=atoi(s);
book.left=book.total;
//输入书的关键字
//显示书的具体信息
voidShowBookMess(Bookbook){
\t书号为:
%3d\n"
book.key);
\t书名为:
%3s\n"
book.bname);
\t作者为:
book.writter);
\t剩余量为:
book.left);
\t总量为:
book.total);
//显示整棵树的信息
voiddisplay(BTreeT){
if(T){
ShowBTNode(T);
//显示这个结点的全部值
for(i=0;
=T->
i++){//使用递归的方法显示每个结点
if(T->
ptr[i]){
display(T->
ptr[i]);
}
//借阅
StatusBorrowBook(BTreeT,KeyTypek){
Resultrs=SearchBTree(T,k);
if(rs.tag==0){
\t很抱歉!
你要借阅的书不存在!
returnFALSE;
if(rs.pt->
key[rs.i].left<
1){
你要借阅的书已经借完!
rs.pt->
key[rs.i].left--;
returnOK;
//还书
StatusReturnBook(BTreeT,KeyTypek){
intnumber;
不存在你要还的书!
key[rs.i].left>
=rs.pt->
key[rs.i].total)
printf("
\t该书无借出\n"
else
rs.pt->
key[rs.i].left++;
//显示书的信息
voidShowWriterBook(BTreep,charwriter[]){
if(strcmp(p->
key[i].writter,writer)==0){
\t\t\t书号为:
//菜单
charmenu_selete(){
charch;
system("
cls"
\t************************图书管理系统**********************\n\n"
\t1.新书入库.\t2.查找书籍.\n"
\t3.显示库存.\t4.借阅.\n"
\t5.还书\t6.退出.\n"
\t*************************************************************\n\n"
\t请选择你所需要的操作(1~6):
do{
ch=getch();
}while(ch<
'
1'
||ch>
7'
returnch;
voidmain(){
KeyTypek;
Resultrs;
read();
while
(1){
switch(menu_selete()){
case'
:
system("
\t------------------录入书信息----------------\n"
InBookMess(k);
InsertBTree(root,k);
\t---------录入结束---------\n"
save(root);
\t当前书库的库存信息如下:
display(root);
\t按任意键返回"
getch();
break;
2'
\t------------------查找书信息----------------\n"
InBookKey(k);
rs=SearchBTree(root,k);
if(rs.tag==1){
ShowBookMess(rs.pt->
key[rs.i]);
else{
printf("
\t你要查找的书号%d不存在!
k.key);
\n\t------------------查找结束----------------\n"
getch();
3'
\t------------------全部的书----------------\n\n"
display(root);
\t------------------显示完毕-----------------\n"
\tt按任意键返回"
4'
\t------------------借阅-----------------\n"
if(BorrowBook(root,k)){
\n\t借阅成功!
\n\t借阅失败!
\n\t按任意键返回"
5'
\t-----------------还书-----------------\n\n"
if(ReturnBook(root,k)){
\n\t归还成功!
}
\n\t归还失败!
6'
exit(0);