1、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);S
2、tatusBorrowBook(BTreeT,KeyTypek);StatusReturnBook(BTreeT,KeyTypek);voidsave(BTreep);/*/voidsave(BTreep)/保存文件 FILE*fp; if(fp=fopen(book.txt,wb)=NULL) printf(创建文件失败!nn);getchar();return; for(inti=1;ikeynum;i+) fprintf(fp,%d%s%s%d%dn,p-keyi.key,p-keyi.bname,p-keyi.writter,p-keyi.left,p-keyi.total); fcl
3、ose(fp);/读取文件voidread() FILE*fp,fp1;rb)=NULL&(fp=fopen(user.txt读取文件失败! for(inti=1;i+) if(fscanf(fp,%d%s%s%d%d,&bi.key,&bi.bname,&bi.writter,&bi.left,&bi.total)=EOF) break; InsertBTree(root,bi); fclose(fp);/复制结点,将某个结点的值复制到另外一个值上bak,KeyTypek) bak.key=k.key; strcpy(bak.bname,k.bname); bak.left=k.left;
4、bak.total=k.total; strcpy(bak.writter,k.writter);/在一个结点中查找元素,返回结点的位置intSearch(BTreep,KeyTypeK) if(!p) return-1; inti=0;for(i=0;p-keynum&keyi+1.key0&keyi.key=K.key) found=TRUE;else q=p; p=p-ptri;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
5、;ji;j-) KeyTypeCopy(q-keyj+1,q-keyj); q-ptrj+1=q-ptrj; KeyTypeCopy(q-keyi+1,x); q-ptri+1=ap; if(ap) ap-parent=q;keynum+;/分离结点ap)inti,j,n=q-ap=(BTree)malloc(sizeof(BTNode);ap-ptr0=q-ptrs;for(i=s+1,j=1;=n;i+,j+) KeyTypeCopy(ap-keyj,q-keyi);ptrj=q-keynum=n-s;parent=q-parent;=n-s;if(ap-ptri)ptri-parent=
6、ap;q-keynum=s-1;/生成一个新的树结点T,BTreep,KeyTypex,BTreeap)T=(BTree)malloc(sizeof(BTNode);T-keynum=1;/设置当前结点的元素个数ptr0=p;/设置左边结点的树根ptr1=ap;/设置右边的树根KeyTypeCopy(T-key1,x);/将x元素的结点值复制到T的第一个元素中if(p)/当孩子不空的时候就设置当前结点为孩子的双亲 p-parent=T;if(ap) ap-parent=NULL;/当前结点的双亲为空voidShowBTNode(BTreep) printf(t书号为:%dkeyi.key);书
7、名为:%5skeyi.bname);作者为:keyi.writter);剩余量为:%5dkeyi.left);总量为:nT,KeyTypeK)/在m阶B树T上结点*q的keyi与keyi+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-keyi.bname,K.bname)
8、!=0) printf(nt录入失败,原因:.t书号冲突,请重新为该书编号!t已经存在书号为%d的书为:,q- ShowBookMess(q- returnFALSE; else nt该书已经存在!t是否增加其总量(y/n): scanf(%saddnum); if(addnum=Y|addnum=y) q-keyi.total+=K.total;keyi.left+=K.left;nt增加总量后该书的信息如下n elsent该书的信息如下: ShowBookMess(q- returnFALSE;x=K; ap=NULL; finished=needNewRoot=FALSE;while(!
9、needNewRoot&finished)Insert(q,i,x,ap);/插入结点if(q-keynumkeys;parent)/在双亲结点*q中查找x的插入位置q=q- i=Search(q,x); needNewRoot=TRUE;if(needNewRoot)NewRoot(T,q,x,ap);/生成新根结点*T,q和ap为子树指针returnOK;/输入书的具体信息book) chars5;t请输入书号: scanf(,s); book.key=atoi(s);t请输入书名:book.bname);t请输入作者:book.writter);t请输入总量: book.total=at
10、oi(s); book.left=book.total;/输入书的关键字/显示书的具体信息voidShowBookMess(Bookbook)t书号为:%3dn,book.key);t书名为:%3sn,book.bname);t作者为:,book.writter);t剩余量为:,book.left);t总量为:,book.total);/显示整棵树的信息voiddisplay(BTreeT) if(T) ShowBTNode(T); /显示这个结点的全部值 for(i=0;=T-i+)/使用递归的方法显示每个结点 if(T-ptri) display(T-ptri); /借阅StatusBor
11、rowBook(BTreeT,KeyTypek) Resultrs=SearchBTree(T,k); if(rs.tag=0)t很抱歉!你要借阅的书不存在! returnFALSE; if(rs.pt-keyrs.i.leftkeyrs.i.left-; returnOK;/还书StatusReturnBook(BTreeT,KeyTypek) intnumber;不存在你要还的书!keyrs.i.left=rs.pt-keyrs.i.total)printf(t该书无借出n elsers.pt-keyrs.i.left+;/显示书的信息voidShowWriterBook(BTreep,c
12、harwriter) if(strcmp(p-keyi.writter,writer)=0)ttt书号为:/菜单charmenu_selete() charch; system(clst*图书管理系统*nnt1.新书入库.t2.查找书籍.nt3.显示库存.t4.借阅.nt5.还书t6.退出.nt*nnt请选择你所需要的操作(16): do ch=getch(); while(ch7 returnch;voidmain() KeyTypek; Resultrs; read(); while(1) switch(menu_selete() case: system(t-录入书信息-n InBook
13、Mess(k); InsertBTree(root,k);t-录入结束-n save(root);t当前书库的库存信息如下: display(root);t按任意键返回 getch(); break;2t-查找书信息-n InBookKey(k); rs=SearchBTree(root,k); if(rs.tag=1) ShowBookMess(rs.pt-keyrs.i); else printf(t你要查找的书号%d不存在!,k.key);nt-查找结束-n getch();3t-全部的书-nn display(root);t-显示完毕-ntt按任意键返回4t-借阅-n if(BorrowBook(root,k)nt借阅成功!nt借阅失败!nt按任意键返回5t-还书-nn if(ReturnBook(root,k)nt归还成功! nt归还失败!6 exit(0);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1