用B树做的图书管理系统Word文档格式.docx

上传人:b****6 文档编号:21008950 上传时间:2023-01-26 格式:DOCX 页数:15 大小:18.27KB
下载 相关 举报
用B树做的图书管理系统Word文档格式.docx_第1页
第1页 / 共15页
用B树做的图书管理系统Word文档格式.docx_第2页
第2页 / 共15页
用B树做的图书管理系统Word文档格式.docx_第3页
第3页 / 共15页
用B树做的图书管理系统Word文档格式.docx_第4页
第4页 / 共15页
用B树做的图书管理系统Word文档格式.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

用B树做的图书管理系统Word文档格式.docx

《用B树做的图书管理系统Word文档格式.docx》由会员分享,可在线阅读,更多相关《用B树做的图书管理系统Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。

用B树做的图书管理系统Word文档格式.docx

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);

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

当前位置:首页 > 自然科学 > 化学

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

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