目录:

  • 一、实现的设计要求
    • 1、基本要求
    • 2、额外选做要求
  • 二、项目文件管理
  • 三、完整代码
    • 1、实现的接口
    • 2、头文件 BTreeBook.h 全部代码
    • 3、源文件 BTreeBook.cpp 全部代码
    • 4、源文件 main.cpp 全部代码
  • 四、运行结果
  • 五、总结

如果觉得这篇文章有用的话,麻烦大家 点个赞 支持一下!!

一、实现的设计要求

图书管理基本业务活动包括:对一本书的采编入库、清除库存、借阅和归还等等。试设计一个图书管理系统,将上述业务活动借助于计算机系统完成。

1、基本要求

(1)每种书的登记内容至少包括书号、书名、著者、出版社、现存量和总库存量等六项。
(2)作为演示系统,不必使用文件,全部数据可以都在内存存放。但是由于上述四项基本业务活动都是通过书号(即关键字)进行的,所以要用B树(2-3树)对书号建立索引,以获得高效率。
(3)系统应实现的操作及其功能定义如下:
①采编入库:新购入一种书,经分类和确定书号之后登记到图书账目中去。如果这种书在帐中已有,则只将总库存量增加。
②清除库存:某种书已无保留价值,将它从图书账目中注销。
③借阅:如果一种书的现存量大于零,则借出一本,登记借阅者的图书证号和归还期限。
④归还:注销对借阅者的登记,改变该书的现存量。
⑤显示:以凹入表的形式显示B树。这个操作是为了调试和维护的目的而设置的。下列B树的打印格式如下所示:

2、额外选做要求

(1) 增加列出某种书状态的操作。状态信息除了包括这种书记录的全部信息外还包括最早到期(包括已逾期)的借阅者证号,日期可用整数实现,以求简化。

二、项目文件管理

(1)在头文件BTreeBook.h里面定义了B树的有关结构及其接口和图书管理系统有关的操作接口
(2)在源文件BTreeBook.cpp里面实现了头文件BTreeBook.h里面的函数接口。(3)在main.cpp里面定义了主函数,并且把头文件BTreeBook.h包含进来即可调用有关接口。

三、完整代码

1、实现的接口

图书管理系统的操作接口:
void InsertBook(BTree &t, KeyType key, result r, char *bookname, char *writername, char *bookpress, int num); //采编入库
void DeleteBook(BTree &t, KeyType key); //清除库存
void BorrowBook(result r,int number,char *name); //借阅图书
Status ReturnBook(result r, int number, char *name); //归还图书
void ShowBookAll(BTree t, KeyType key); //查看某种图书的信息(包括借阅者)

以上接口需要调用的函数:
void ShowBook(BTree t, KeyType key); //输出某本书的信息(不包括借阅者)
void addBook(BTree t, KeyType key, int num); //添加某本书的数量
Status emtyBook(BTree q, int i); //检查某本书的现存量是否大于0

B树的操作接口:
void SearchBTree(BTree t, KeyType k, result &r); //查找
void InsertBTree(BTree &t, KeyType k, BTree q, int i,BookType *book); //插入
void DeleteBTree(BTree &t, KeyType key); //删除
void InitBTree(BTree &t); //创建
void PrintBTree(BTree t); //遍历打印输出

void Traverse(BTree t, int k);//递归遍历

int SearchBTNode(BTree p, KeyType k);//在结点p中查找关键字k

void split(BTree &q, int s, BTree &ap);//将q结点分裂成两个结点,前一半留在原节点,后一半留在ap指向的新结点
void newRoot(BTree &t, BTree p, KeyType x, BTree ap,BookType *book);//生成新的根结点
void Insert(BTree &q, int i, KeyType x, BTree ap,BookType *book);//关键字x和新结点指针ap分别插入到q->key[i]和q->ptr[i]

int BTNodeDelete(BTNode *p, KeyType key);//在结点p中删除关键字key
int FindBTNode(BTNode *p, KeyType k, int &i);//在结点p中查找关键字k,返回位置i
void Remove(BTNode *p, int i);//在结点p中删除关键字key[i]和其孩子结点ptr[i]
void Substitution(BTNode *p, int i);//在结点p中查找被删除的关键字key[i]的替代叶子结点
void AdjustBTree(BTNode *p, int i);//在结点p中删除关键字key[i]后调整B树
void MoveRight(BTNode *p, int i);//将双亲结点p中的最后一个关键字移入右结点q中,将左结点aq中的最后一个关键字移入双亲结点p中
void MoveLeft(BTNode *p, int i);//将双亲结点p中的第一个关键字移入结点aq中,将结点q中的第一个关键字移入双亲结点p中
void Combine(BTNode *p, int i);//将双亲结点p、右结点q合并入左结点aq,并调整双亲结点p中的剩余关键字的位置

2、头文件 BTreeBook.h 全部代码

#pragma once#define m 3  //B树的阶
#define TRUE 1;
#define FALSE 0;
#define OK  1;
#define ERROR 0;
#define OVERFLOW -1;
typedef int Status;typedef int KeyType; //书号BookId类型
typedef struct ReaderType{int readerId;    //读者图书证号char name[20];   //读者姓名int time;        //归还时间struct ReaderType * next;
}ReaderType;  //读者类型
typedef struct {char bookName[30];   //书名char writerName[20]; //作者char bookPress[30];  //出版社int booknumNow;    //现存量int booknumAll;    //总库存量ReaderType * reader;
}BookType;  //书本类型typedef struct BTNode {int keynum;                  //结点当前的关键字个数KeyType key[m + 1];          //关键字数组,key[0]未用struct BTNode * parent;      //双亲结点指针struct BTNode * ptr[m + 1];  //孩子结点指针数组BookType * book[m + 1];      //书本指针数组,bkptr[0]未用
}BTNode, *BTree;  //B树的结点和指针类型typedef struct {BTree pt;  //指向找到的结点int i;     //结点中的关键字位序int tag;   //1为成功,0为失败
}result; //Search结果类型//图书管理的操作接口
void InsertBook(BTree &t, KeyType key, result r, char *bookname, char *writername, char *bookpress, int num);  //采编入库
void DeleteBook(BTree &t, KeyType key);                                          //清除库存
void BorrowBook(result r,int number,char *name);                              //借阅图书
Status ReturnBook(result r, int number, char *name);                          //归还图书
void ShowBookAll(BTree t, KeyType key);                                      //查看某种图书的信息(包括借阅者)void ShowBook(BTree t, KeyType key); //输出某本书的信息
void addBook(BTree t, KeyType key, int num); //添加某本书的数量
Status emtyBook(BTree q, int i); //检查某本书的现存量是否大于0//B树的操作接口
void SearchBTree(BTree t, KeyType k, result &r);                           //查找
void InsertBTree(BTree &t, KeyType k, BTree q, int i,BookType *book);      //插入
void DeleteBTree(BTree &t, KeyType key);                                   //删除
void InitBTree(BTree &t);                                                  //创建
void PrintBTree(BTree t);                                                  //遍历打印输出void Traverse(BTree t, int k);//递归遍历int SearchBTNode(BTree p, KeyType k);//在结点p中查找关键字kvoid split(BTree &q, int s, BTree &ap);//将q结点分裂成两个结点,前一半留在原节点,后一半留在ap指向的新结点
void newRoot(BTree &t, BTree p, KeyType x, BTree ap,BookType *book);//生成新的根结点
void Insert(BTree &q, int i, KeyType x, BTree ap,BookType *book);//关键字x和新结点指针ap分别插入到q->key[i]和q->ptr[i]int BTNodeDelete(BTNode *p, KeyType key);//在结点p中删除关键字key
int FindBTNode(BTNode *p, KeyType k, int &i);//在结点p中查找关键字k,返回位置i
void Remove(BTNode *p, int i);//在结点p中删除关键字key[i]和其孩子结点ptr[i]
void Substitution(BTNode *p, int i);//在结点p中查找被删除的关键字key[i]的替代叶子结点
void AdjustBTree(BTNode *p, int i);//在结点p中删除关键字key[i]后调整B树
void MoveRight(BTNode *p, int i);//将双亲结点p中的最后一个关键字移入右结点q中,将左结点aq中的最后一个关键字移入双亲结点p中
void MoveLeft(BTNode *p, int i);//将双亲结点p中的第一个关键字移入结点aq中,将结点q中的第一个关键字移入双亲结点p中
void Combine(BTNode *p, int i);//将双亲结点p、右结点q合并入左结点aq,并调整双亲结点p中的剩余关键字的位置

3、源文件 BTreeBook.cpp 全部代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"BTreeBook.h"//图书管理的操作实现
void InsertBook(BTree &t,KeyType key, result r,char *bookname,char *writername,char *bookpress,int num) {BookType *book;book = (BookType *)malloc(sizeof(BookType));strcpy_s(book->bookName, bookname);strcpy_s(book->writerName, writername);strcpy_s(book->bookPress, bookpress);book->booknumAll = num;book->booknumNow = num;book->reader = NULL;if(r.tag==0)InsertBTree(t, key, r.pt, r.i, book);
}//采编入库
void DeleteBook(BTree &t, KeyType key) {DeleteBTree(t, key);
}//清除库存
void BorrowBook(result r,int number,char *name) {ReaderType *reader;reader = (ReaderType *)malloc(sizeof(ReaderType));strcpy_s(reader->name, name);reader->readerId = number;reader->time = 50;ReaderType *q;q = r.pt->book[r.i]->reader;if (q == NULL) {r.pt->book[r.i]->reader = reader;reader->next = NULL;}else {reader->next = r.pt->book[r.i]->reader;r.pt->book[r.i]->reader = reader;}r.pt->book[r.i]->booknumNow--;
}//借阅图书
Status ReturnBook(result r, int number, char *name) {ReaderType *q,*p;q = r.pt->book[r.i]->reader;p = q;while (q != NULL && (q->readerId != number || strcmp(q->name,name))) {p = q;q = q->next;}if (q == NULL) {return FALSE;}else {if (q == r.pt->book[r.i]->reader)r.pt->book[r.i]->reader = q->next;else p->next = q->next;free(q);r.pt->book[r.i]->booknumNow++;}return TRUE;
}//归还图书
void ShowBookAll(BTree t, KeyType key) {ShowBook(t, key);result r;SearchBTree(t, key, r);ReaderType *q;q = r.pt->book[r.i]->reader;while (q != NULL) {printf("|借阅证号:%d, 姓名:%s, 最迟还书时间为:%d。\n",q->readerId,q->name,q->time);printf("|-------------------------------------------------------------------------|\n");q = q->next;}
}//输出某本书的全部信息(包括借阅者)void ShowBook(BTree t,KeyType key) {result r;SearchBTree(t, key, r);if (r.tag == 1) {printf("|-------------------------------------------------------------------------|\n");printf("|书号     书名           作者          出版社            现存量  总库存量 |\n");printf("|-------------------------------------------------------------------------|\n");printf("|%d     %s      %s     %s        %d     %d     |\n", r.pt->key[r.i], r.pt->book[r.i]->bookName,r.pt->book[r.i]->writerName, r.pt->book[r.i]->bookPress, r.pt->book[r.i]->booknumNow, r.pt->book[r.i]->booknumAll);printf("|-------------------------------------------------------------------------|\n");}
}//输出某本书的信息(不包括借阅者)
void addBook(BTree t, KeyType key, int num) {result r;SearchBTree(t, key, r);if (r.tag == 1) {r.pt->book[r.i]->booknumNow = r.pt->book[r.i]->booknumNow + num;r.pt->book[r.i]->booknumAll = r.pt->book[r.i]->booknumAll + num;}
}//添加某本书的数量
Status emtyBook(BTree q, int i) {if (q->book[i]->booknumNow >= 1)return FALSE;return TRUE;
}//检查某本书的现存量是否大于0//查找
void SearchBTree(BTree t, KeyType k, result &r) {int i = 0, found = 0;BTree p = t, q = NULL;while (p != NULL && found == 0) {i = SearchBTNode(p, k);if (i <= p->keynum && p->key[i] == k)found = 1;else {q = p;p = p->ptr[i - 1];}}if (found == 1) {r.pt = p;r.i = i;r.tag = 1;}else {r.pt = q;r.i = i;r.tag = 0;}
}
int SearchBTNode(BTree p, KeyType k) {int i = 1;while (i <= p->keynum && k > p->key[i])i++;return i;
}//在结点p中查找关键字k//插入
void InsertBTree(BTree &t, KeyType k, BTree q, int i,BookType *book) {int s, finished = 0, needNewRoot = 0;KeyType x;BookType *b;BTree ap;if (q == NULL) newRoot(t, NULL, k, NULL, book);else {x = k;ap = NULL;b = book;while (needNewRoot == 0 && finished == 0) {Insert(q, i, x, ap, b);if (q->keynum < m) finished = 1;else {s = (m + 1) / 2;split(q, s, ap);x = q->key[s];b = q->book[s];if (q->parent != NULL) {q = q->parent;i = SearchBTNode(q, x);}else needNewRoot = 1;}}if (needNewRoot == 1)newRoot(t, q, x, ap, b);}
}//在BTree中插入关键字key
void split(BTree &q, int s, BTree &ap) {int i, j, n = q->keynum;ap = (BTNode *)malloc(sizeof(BTNode));ap->ptr[0] = q->ptr[s];for (i = s + 1, j = 1;i <= n;i++, j++) {ap->key[j] = q->key[i];ap->ptr[j] = q->ptr[i];ap->book[j] = q->book[i];}ap->keynum = n - s;ap->parent = q->parent;for (i = 0;i <= n - s;i++)if (ap->ptr[i] != NULL) ap->ptr[i]->parent = ap;q->keynum = s - 1;
}//将q结点分裂成两个结点,前一半留在原节点,后一半留在ap指向的新结点
void newRoot(BTree &t, BTree p, KeyType x, BTree ap,BookType *book) {t = (BTNode *)malloc(sizeof(BTNode));t->keynum = 1;t->ptr[0] = p;t->ptr[1] = ap;t->key[1] = x;t->book[1] = book;if (p != NULL) p->parent = t;if (ap != NULL) ap->parent = t;t->parent = NULL;
}//生成新的根结点
void Insert(BTree &q, int i, KeyType x, BTree ap,BookType *book) {int j, n = q->keynum;for (j = n;j >= i;j--) {q->key[j + 1] = q->key[j];q->ptr[j + 1] = q->ptr[j];q->book[j + 1] = q->book[j];}q->key[i] = x;q->ptr[i] = ap;q->book[i] = book;if (ap != NULL)ap->parent = q;q->keynum++;
}//关键字x和新结点指针ap分别插入到q->key[i]和q->ptr[i]//删除
void DeleteBTree(BTree &t, KeyType key) {BTNode *p;int a = BTNodeDelete(t, key);                        //删除关键字key if (a == 0)                                        //查找失败 printf("关键字%d不在B树中\n", key);else if (t->keynum == 0) {                          //调整 p = t;t = t->ptr[0];free(p);}
} //删除关键字key
int BTNodeDelete(BTNode *p, KeyType key) {int i;int tag; //查找标志if (p == NULL)return 0;else {tag = FindBTNode(p, key, i);  //返回查找结果 if (tag == 1)  //查找成功{if (p->ptr[i - 1] != NULL) {             //删除的是非叶子结点Substitution(p, i);                  //寻找相邻关键字(右子树中最小的关键字)BTNodeDelete(p->ptr[i], p->key[i]);  //执行删除操作}else Remove(p, i);                       //从结点p中位置i处删除关键字}elsetag = BTNodeDelete(p->ptr[i], key); //沿孩子结点递归查找并删除关键字kif (p->ptr[i] != NULL)if (p->ptr[i]->keynum < (m - 1) / 2)     //删除后关键字个数小于MIN=(m-1)/2AdjustBTree(p, i);                   //调整B树 return tag;}
}//在结点p中删除关键字key
int FindBTNode(BTNode *p, KeyType k, int &i) { //反映是否在结点p中是否查找到关键字k if (k < p->key[1]) {                                //结点p中查找关键字k失败 i = 0;return 0;}else {                                           //在p结点中查找i = p->keynum;while (k < p->key[i] && i>1)i--;if (k == p->key[i])                            //结点p中查找关键字k成功 return 1;}
}//在结点p中查找关键字k,返回位置i
void AdjustBTree(BTNode *p, int i) {int Min = (m - 1) / 2;if (i == 0)                                        //删除的是最左边关键字if (p->ptr[1]->keynum > Min)                   //右结点可以借MoveLeft(p, 1);else                                        //右兄弟不够借 Combine(p, 1);else if (i == p->keynum)                           //删除的是最右边关键字if (p->ptr[i - 1]->keynum > Min)                 //左结点可以借 MoveRight(p, i);else                                        //左结点不够借 Combine(p, i);else if (p->ptr[i - 1]->keynum > Min)                //删除关键字在中部且左结点够借 MoveRight(p, i);else if (p->ptr[i + 1]->keynum > Min)                //删除关键字在中部且右结点够借 MoveLeft(p, i + 1);else                                            //删除关键字在中部且左右结点都不够借Combine(p, i);
}//在结点p中删除关键字key[i]后调整B树
void Remove(BTNode *p, int i) {int j;for (j = i + 1;j <= p->keynum;j++) {     //前移删除key[i]和ptr[i]p->key[j - 1] = p->key[j];p->ptr[j - 1] = p->ptr[j];p->book[j - 1] = p->book[j];}p->keynum--;
}//在结点p中删除关键字key[i]和其孩子结点ptr[i]
void Substitution(BTNode *p, int i) {BTNode *q;for (q = p->ptr[i];q->ptr[0] != NULL;q = q->ptr[0]);p->key[i] = q->key[1];  //复制关键字值p->book[i] = q->book[1];
} //查找被删关键字p->key[i](在非叶子结点中)的替代叶子结点(右子树中值最小的关键字)
void MoveRight(BTNode *p, int i) {int j;BTNode *q = p->ptr[i];BTNode *aq = p->ptr[i - 1];for (j = q->keynum;j > 0;j--) {                       //将右兄弟q中所有关键字向后移动一位q->key[j + 1] = q->key[j];q->ptr[j + 1] = q->ptr[j];q->book[j + 1] = q->book[j];}q->ptr[1] = q->ptr[0];                            //从双亲结点p移动关键字到右兄弟q中q->key[1] = p->key[i];q->book[1] = q->book[i];q->keynum++;p->key[i] = aq->key[aq->keynum]; //将左兄弟aq中最后一个关键字移动到双亲结点p中p->book[i] = aq->book[aq->keynum];p->ptr[i]->ptr[0] = aq->ptr[aq->keynum];aq->keynum--;
}//将双亲结点p中的最后一个关键字移入右结点q中,将左结点aq中的最后一个关键字移入双亲结点p中
void MoveLeft(BTNode *p, int i) {/*将双亲结点p中的第一个关键字移入左结点aq中,将右结点q中的第一个关键字移入双亲结点p中*/int j;BTNode *aq = p->ptr[i - 1];BTNode *q = p->ptr[i];aq->keynum++;                                   //把双亲结点p中的关键字移动到左兄弟aq中aq->key[aq->keynum] = p->key[i];aq->book[aq->keynum] = p->book[i];aq->ptr[aq->keynum] = p->ptr[i]->ptr[0];p->key[i] = q->key[1];  //把右兄弟q中的关键字移动到双亲节点p中  p->book[i] = q->book[1];q->ptr[0] = q->ptr[1];q->keynum--;for (j = 1;j <= aq->keynum;j++) {                     //将右兄弟q中所有关键字向前移动一位aq->key[j] = aq->key[j + 1];aq->book[j] = aq->book[j + 1];aq->ptr[j] = aq->ptr[j + 1];}
}//将双亲结点p中的第一个关键字移入结点aq中,将结点q中的第一个关键字移入双亲结点p中
void Combine(BTNode *p, int i) {int j;BTNode *q = p->ptr[i];BTNode *aq = p->ptr[i - 1];aq->keynum++;                                  //将双亲结点的关键字p->key[i]插入到左结点aq     aq->key[aq->keynum] = p->key[i];aq->book[aq->keynum] = p->book[i];aq->ptr[aq->keynum] = q->ptr[0];for (j = 1;j <= q->keynum;j++) {                      //将右结点q中的所有关键字插入到左结点aq aq->keynum++;aq->key[aq->keynum] = q->key[j];aq->book[aq->keynum] = q->book[i];aq->ptr[aq->keynum] = q->ptr[j];}for (j = i;j < p->keynum;j++) {                       //将双亲结点p中的p->key[i]后的所有关键字向前移动一位 p->key[j] = p->key[j + 1];p->book[j] = p->book[j + 1];p->ptr[j] = p->ptr[j + 1];}p->keynum--;                                    //修改双亲结点p的keynum值 free(q);                                        //释放空右结点q的空间
}//将双亲结点p、右结点q合并入左结点aq,并调整双亲结点p中的剩余关键字的位置//创建
void InitBTree(BTree &t) {result r;int j, n = 18;KeyType key[] = { 35,16,18,70,5,50,22,60,13,17,12,45,25,42,15,90,30,7 };int num[] = { 50,60,75,81,45,12,44,55,66,77,85,40,40,52,59,98,87,85 };char name[18][30] = { "数据结构","简明大学物理学","平凡的世界","设计模式","哈姆雷特","月亮与六便士","C语言程序设计","市场营销学","数字逻辑与EDA设计","JAVA核心技术(卷一)","看见","离散数学及其应用","高等数学(上册)","高等数学(下册)","计算机科学概论","线性代数","电工学(上册)","电工学(下册)" };char writer[18][20] = { "吴伟民","范仰才","路遥","刘伟","莎士比亚","毛姆","谭浩强","张德鹏","丁磊","凯 S.霍斯特曼","柴静","傅彦","同济大学数学系","同济大学数学系","Dennis Brylow","同济大学数学系","苏成悦","苏成悦" };char press[18][20] = { "高等教育出版社","高等教育出版社","北京十月文艺出版社","清华大学出版社","中国宇航出版社","浙江文艺出版社","清华大学出版社","广东高等教育出版社","人民邮电出版社","机械工业出版社","广西师范大学出版社","高等教育出版社","高等教育出版社","高等教育出版社","人民邮电出版社","高等教育出版社","复旦大学出版社","复旦大学出版社" };for (j = 0;j < n;j++) {     //逐一插入元素SearchBTree(t, key[j], r);if (r.tag == 0)InsertBook(t, key[j], r, name[j], writer[j], press[j], num[j]);printf("插入%d:\n", key[j]);PrintBTree(t);   //调试输出ShowBook(t, key[j]);}
}//凹入表输出
void PrintBTree(BTree t) {printf("此时B树的状态如下:\n");if (t == NULL)printf("此B树为空树\n");elseTraverse(t, 0); //以凹入表的形式递归遍历输出
}
void Traverse(BTree t, int k) {if (t != NULL) {int i;for (i = 1;i <= t->keynum;i++) {if (t->ptr[i - 1] != NULL) {  //输出非终端结点if (i == 1) {for (int j = 1;j <= (k * 2);j++) printf("  "); //输出空格for (int j = 1;j <= t->keynum;j++) {if (j == t->keynum) printf("%d\n", t->key[j]);else printf("%d,", t->key[j]);}k++;}}else {                        //输出终端结点if (i == 1 && i == t->keynum) {for (int j = 1;j <= (k * 2);j++) printf("  ");//输出空格printf("%d\n", t->key[i]);}if (i == 1 && i < t->keynum) {for (int j = 1;j <= (k * 2);j++) printf("  ");//输出空格printf("%d,", t->key[i]);}if (i != 1 && i < t->keynum) {printf("%d,", t->key[i]);}if (i != 1 && i == t->keynum) {printf("%d\n", t->key[i]);}}if (i == 1)Traverse(t->ptr[i - 1], k);Traverse(t->ptr[i], k);  //递归遍历}}
}//以凹入表的形式递归遍历输出

4、源文件 main.cpp 全部代码

#include<stdio.h>
#include<stdlib.h>
#include"BTreeBook.h"int main() {printf(" |****************************************************|\n");printf(" |*****************|  图书管理系统  |*****************|\n");printf(" |****************************************************|\n");printf(" |     1:采编入库                 2:清除库存        |\n");printf(" |     3:借阅图书                 4:归还图书        |\n");printf(" |     5:查看某种图书信息         6:输出B树的状态   |\n");printf(" |     0:退出                                        |\n");printf(" |****************************************************|\n");printf(" |       CSDN  阿猪12138                              |\n");printf(" |****************************************************|\n");printf(" |请输入操作的对应编号:                              |\n");printf(" |----------------------------------------------------|\n");BTree T;T = NULL;InitBTree(T);PrintBTree(T);printf(" 初始化完成!\n");printf("**************************************************************************************\n");result r;int flag = 1;while (flag){int i;scanf_s("%d", &i);switch (i){case 1:printf("请输入书的编号\n");int key01;scanf_s("%d", &key01);SearchBTree(T, key01, r);if (r.tag == 1) {printf("此书本已存在\n");ShowBook(T, key01);int n1;printf("请输入需要添加此书本的数量\n");scanf_s("%d", &n1);addBook(T, key01, n1);}else {printf("此书本不存在,\n");char bn[30], bw[20], bp[30];printf("请按顺序输入此书的书名、作者、出版社(用空格隔开)\n");scanf_s("%s%s%s", bn,30,bw,20,bp,30);printf("请输入需要添加此书本的数量\n");int n2;scanf_s("%d", &n2);InsertBook(T, key01, r, bn, bw, bp, n2);}printf("添加完成!\n");ShowBook(T, key01);PrintBTree(T);printf("**************************************************************************************\n");break;case 2:printf("请输入书的编号\n");int key02;scanf_s("%d", &key02);SearchBTree(T, key02, r);if (r.tag == 0)printf("此书本不存在!\n");else {ShowBook(T, key02);printf("提示:清除后不可恢复!请确认是否清除:\n");printf("  1:确认清除       0:取消  \n");int a;scanf_s("%d", &a);if (a == 1) {DeleteBook(T, key02);printf("清除成功!\n");}elseprintf("已取消\n");}PrintBTree(T);printf("**************************************************************************************\n");break;case 3:printf("请输入书的编号\n");int key03;scanf_s("%d", &key03);SearchBTree(T, key03, r);if(r.tag==0)printf("此书本不存在!\n");else {ShowBook(T, key03);if (emtyBook(r.pt, r.i))printf("此书本现库存不足,暂时无法借阅!\n");else {printf("请确认是否借书:\n");printf("1:确认   0:取消  \n");int a;scanf_s("%d", &a);if (a == 1) {printf("请输入借阅证号:\n");int q;scanf_s("%d", &q);printf("请输入姓名:\n");char name[20];scanf_s("%s", name, sizeof(name));BorrowBook(r, q, name);ShowBook(T, key03);printf("借书成功!\n");}elseprintf("已取消\n");}}printf("**************************************************************************************\n");break;case 4:printf("请输入书的编号\n");int key04;scanf_s("%d", &key04);SearchBTree(T, key04, r);if (r.tag == 0)printf("此书本不存在!\n");else {ShowBook(T, key04);printf("请确认是否还书:\n");printf("1:确认   0:取消  \n");int b;scanf_s("%d", &b);if ( b == 1) {printf("请输入借阅证号:\n");int q;scanf_s("%d", &q);printf("请输入姓名:\n");char name[20];scanf_s("%s", name, sizeof(name));if (ReturnBook(r, q, name)) {ShowBook(T, key04);printf("还书成功!\n");}elseprintf("还书失败!查无对应的借阅者!\n");}elseprintf("已取消\n");}printf("**************************************************************************************\n");break;case 5:printf("请输入书的编号\n");int key05;scanf_s("%d", &key05);SearchBTree(T, key05, r);if (r.tag == 0)printf("此书本不存在!\n");else {ShowBookAll(T, key05);}printf("**************************************************************************************\n");break;case 6:PrintBTree(T);printf("**************************************************************************************\n");break;case 0:flag = 0;break;default:printf("输入错误,请重新输入!\n");printf("**************************************************************************************\n");break;}}return 1;
}

四、运行结果

(1)程序主界面

(2)采编入库


(3)清除库存

(4)借阅图书


(5)归还图书

五、总结

(1)此图书管理系统是基于B树实现的。B树的重点算法的查找操作,插入和删除操作都要调用。难点在于删除关键字的算法。B树由于自身的存储结构的原因,其查找算法的时间效率是很高的。因此B树普遍将大型数据库文件存储在硬盘上,以减少访问硬盘次数为目的。为了提高 B树性能,还有很多种B树的变型,力图对B树进行改进,比如B+树。但由于B树结构的复杂性,使得B树的实现算法较一般地数据结构要复杂不少,其实现的函数接口也十分的多。
(2)说明:本程序所有测试用例均为博主自己所选、编,仅用于测试,无其他含义。另外,本程序为博主数据结构期末课设。由于博主能力有限及时间紧迫,本程序较为简陋,有待提高,望理解。

(3)如果觉得这篇文章有用的话,麻烦大家 点个赞 支持一下!!

基于B树的图书管理系统(C语言)(含完整代码)相关推荐

  1. 校运动会c语言程序编写,校运动会管理系统报告C语言(含完整代码)

    <校运动会管理系统报告C语言(含完整代码)>由会员分享,可在线阅读,更多相关<校运动会管理系统报告C语言(含完整代码)(20页珍藏版)>请在人人文库网上搜索. 1.目 录陈一. ...

  2. 基于顺序表的图书管理系统(C语言)

    Visual Studio编译环境 功能: 0.退出.             1.基于顺序存储结构的图书信息表的创建和输出.             2.基于顺序存储结构的图书信息表的新图书的入库. ...

  3. 图书管理系统 (c语言实现) (全部代码)

    直接上代码不解释 #include <stdio.h> #include <stdlib.h> #include <string.h> #define AVAILA ...

  4. 校运动会管理系统报告C语言,校运动会管理系统的报告C语言(含完整代码).doc

    目 录 陈 TOC \o "1-3" \h \z \u HYPERLINK \l "_Toc251420108" 一.程序分析与设计 PAGEREF _Toc2 ...

  5. 【毕业设计】基于spring boot的图书管理系统 -java 计算机 软件工程

    文章目录 1 前言 2 系统简介 2.1 领域模型 2.2 技术栈 2.3 表结构设计 2.4 接口设计 2.4.1 接口定义 2.4.2 接口测试 2.5 权限设计 3 运行效果 3.1 系统登录 ...

  6. 基于Java+Swing+mysql图书管理系统

    基于Java+Swing+mysql图书管理系统 一.系统介绍 二.功能展示 1.用户登陆 2.图书管理 3.图书添加 4.图书类别管理 5.图书类别添加 三.数据库 四.其它 1.其他系统实现 五. ...

  7. 基于python/django的图书管理系统

    摘  要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准 ...

  8. 计算机毕业设计ssm基于用户激励的图书管理系统fx8il系统+程序+源码+lw+远程部署

    计算机毕业设计ssm基于用户激励的图书管理系统fx8il系统+程序+源码+lw+远程部署 计算机毕业设计ssm基于用户激励的图书管理系统fx8il系统+程序+源码+lw+远程部署 本源码技术栈: 项目 ...

  9. 数据结构实验1《基于线性表的图书管理系统》

    数据结构实验1<基于线性表的图书管理系统> (visual studio 2019可运行) 输入及输出要求见<数据结构C语言(第二版)>严蔚敏版 [本文仅用于啥都看不懂还想交作 ...

最新文章

  1. 《ANSYS 14.0超级学习手册》一第2章 高级应用的基石——APDL
  2. 聊聊WEB系列_Index
  3. java gstripe_通过Stripe Connect进行交易
  4. 我的网站搭建: (第一天) 模型设计
  5. S6 edge+的多米诺骨牌效应:大屏的趋势
  6. React Native开发错误警告处理总结(已解决 !持续更新)
  7. U3D assetbundle打包
  8. ITK:用颜色标记图像中的区域
  9. 修改Windows登陆时显示上一次登陆的用户名
  10. 【最小割】HDU 4971 A simple brute force problem.
  11. Java loadlibrary分析及如何unload
  12. 卷积神经网络之迁移学习
  13. ios微信上无法自动播放音频的情况
  14. CF 235C. Cyclical Quest [后缀自动机]
  15. css的盒子模型以及布局(面试考点)
  16. 学习笔记(02):19年录制Zookeeper、Dubbo视频教程 微服务教程分布式教程 SpringBoot教程整合-传统互联网架构到分布式架构的架构演变...
  17. h5 7个移动端框架
  18. 计算机excel函数试题,2014职称计算机考试Excel试题函数练习题
  19. wps表格的宏被禁用问题
  20. echarts字符云(词云)

热门文章

  1. 【烈日炎炎战后端】JAVA虚拟机(3.6万字)
  2. Appium+Python MAC安装Android夜神模拟器(二)
  3. DFS(深度优先搜索算法)——Java实现(含例题)
  4. centos7.9-kvm-ESXi相关操作
  5. 拼多多登陆 JS 密码字段加密解析
  6. 嵌入式--LCD常用接口介绍
  7. 神经网络(Neural Networks)简介
  8. Android SELinux开发入门指南之如何增加Java Binder Service权限
  9. mbr linux安装分区格式,装机、做系统必备:秒懂MBR和GPT分区表
  10. 利用压缩文件修改加密word文档