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

编程入门 行业动态 更新时间:2024-10-16 02:23:46

基于B树的图书管理系统(C语言)(含<a href=https://www.elefans.com/category/jswz/34/1771399.html style=完整代码)"/>

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

目录:

  • 一、实现的设计要求
    • 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语言)(含完整代码)

本文发布于:2023-06-20 02:53:37,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/795006.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:完整   语言   图书管理系统   代码

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!