这是很久之前做的一个课设了,主要使用平衡二叉树(AVL)来实现,并在原有的基础上增加了很多功能~
整个报告内容较多,这里暂时只给出部分主要内容~
1.系统总体设计
该图书馆信息管理系统为实现大规模数据的快速查找、添加、删除和修改功能,主要采用平衡二叉查找树(AVL)的数据结构,同时增加了读者借阅信息的内容,该部分用了链表的数据结构来储存,使得借阅信息的插入和删除更加灵活高效。
平衡二叉查找树(AVL)就是对于每一个子树来说,左子节点的值小于父节点,右子节点的值大于父节点,并且在BST树的基础上为每个节点添加了平衡因子和树高来判断树的平衡性,通过保证所有节点的左子树和右子树的高度差不大于1来保证树的平衡,从而提高查找、插入和删除等操作的效率。
链表(Linked List)是由一系列包含数据和指针(增加了尾指针)两部分的节点(Node)构成的一种线性数据结构。其每个节点都是通过指针进行连接的,长度可以动态调整,使得节点的插入、删除操作变得非常灵活高效。
同时在图书查找的实现上,还使用了布隆过滤器,通过哈希函数和哈希表来查找,很好的提高了查找效率。
本系统在部分技术实现上还使用了递归算法。
2.系统功能设计
系统的功能设计见下表
基本功能 | 说明 |
文件读入 | 程序开始系统自动从文件读入图书信息并建立二叉树。 |
功能菜单 | 输入对应的序号,执行对应的操作。 |
图书查询 | 通过输入书号或书名来查找对应书籍,并显示该书的具体信息。 |
新书添加 | 输入书的基本信息来添加新书,如果库中已经有该书,则更新该书的现存量,如果原来没有,则添加新的节点,并重新平衡AVL树。 |
旧书删除 | 先查找对应书籍的结点,然后删除该结点,并重新平衡AVL树。 |
图书信息更新 | 先查找对应书籍的结点,然后更新该结点对应的信息。 |
文件更新 | 在完成操作退出系统后自动将修改后的二叉树写入文件 |
新增功能 | 说明 |
用户登录 | 选择用户类型:管理员&读者;管理员输入用户名和密码,失败则返回重输。 |
借书 | 先查找对应书籍,再通过输入姓名、学号、借阅时间等信息来实现借阅信息的添加和借阅量的更新。 |
还书 | 先查找对应书籍, 然后通过学号查找对应的借阅信息,删除该结点,并更新借阅量。 |
AVL树打印 | 通过打印二叉树来实现AVL树结构的可视化 |
表1 系统的功能设计
3.类的总体设计
node类(链表结点-借阅信息)
node类的设计
node类 | ||
成员变量 | 解释 | |
string | stuname | 读者姓名 |
string | xuehao | 学号 |
string | begintime | 借阅时间 |
string | endtime | 到期时间 |
成员函数 | 解释 | |
node(string n,string xh,string b,string n) | 带有参数的构造函数 |
表2 node类设计
borrowbook类(链表)
borrowbook类的设计
borrowbook类 | ||
成员变量 | 解释 | |
node* | head | 头指针 |
node* | p | 辅助指针 |
node* | last | 尾指针 |
成员函数 | 解释 | |
borrowbook() | 无参构造函数 | |
borrowbook(borrowbook& a) | 拷贝构造函数 | |
void addnode(string a, string b, string c,string d) | 增加结点函数 | |
void deletenode(string xh) | 删除结点函数 | |
void pointout() | 控制台打印结点信息函数 | |
void pointfout(ofstream& fout) | 结点信息文件流更新函数 |
表3 borrowbook类设计
bookinform类(图书信息)
bookinform类的设计
bookinform类 | ||
成员变量 | 解释 | |
int | ID | 书号 |
string | name | 书名 |
string | writer | 作者 |
int | allnum | 现存总数 |
int | borrownum | 借阅量 |
borrowbook | borrowdata | 借阅信息(链表) |
成员函数 | 解释 | |
bookinform(int id , string na, string w , int all, int b , borrowbook bi) : ID(id),name(na),writer(w), num1(all),num2(b), borrowdata(bi) {} | 有参构造函数 | |
void pointbf() | 信息打印函数 |
表4 bookinform类设计
BNode类(二叉树结点)
BNode类的设计
BNode类 | ||
成员变量 | 解释 | |
int | key | 关键字 |
bookinform | data | 图书信息 |
BNode* | lchild | 左孩子结点 |
BNode* | rchild | 右孩子结点 |
BNode* | parent | 父亲结点 |
int | ht | 平衡因子 |
成员函数 | 解释 | |
BNode(int k, bookinform d):key(k),data(d),lchild(0),rchild(0),parent(0),ht(1){} | 有参构造函数 | |
void informpoint() | 结点信息打印函数 |
表5 BNode类设计
filter类(布隆过滤器)
filter类的设计 可以极大优化系统的性能
filter类 | ||
成员变量 | 解释 | |
int | max | 布隆过滤器长度 |
std::bitset | bloomFilter | 比特位信息 |
成员函数 | 解释 | |
filter() | 无参构造函数 | |
~filter() | 析构函数 | |
void insertToBloomFilter(std::string str) | 插入函数 | |
bool searchInBloomFilter(std::string str) | 查找函数 |
表6 filter类设计
Btree类(AVL树)
Btree类的设计
Btree类 | ||
成员变量 | 解释 | |
BNode* | r | 根结点 |
filter | b1 | 书名查找布隆过滤器 |
filter | b2 | 书号查找布隆过滤器 |
成员函数 | 解释 | |
Btree() | 无参构造函数 | |
~Btree() | 析构函数 | |
void DesBtree(BNode* r) | 结点释放函数 | |
void addBNode (int k, bookinform d) | 结点增加函数 | |
void LL(BNode* p) | 左旋 | |
void RR(BNode* p) | 右旋 | |
void LR(BNode* p) | LRL情况 | |
void RL(BNode* p) | RLR情况 | |
BNode* searchbook1(int ID) | 书号查找函数 | |
BNode* search1(BNode* p, int k) | 书号查找辅助函数 | |
BNode* searchbook2(string name) | 书名查找函数 | |
BNode* search2(BNode* b,string name) | 书名查找辅助函数 | |
void deleteBNode(BNode* k) | 结点删除函数 | |
void filetree(ofstream& fout) | 文件信息更新函数 | |
void fileBNode(BNode* b, ofstream& fout) | 文件信息更新辅助函数 | |
void printBtree() | AVL树打印函数 | |
void printBNode(BNode* b, int t) | AVL树打印辅助函数 |
表7 Btree类设计
menu类(菜单)
menu类的设计
menu类 | ||
成员变量 | 解释 | |
Btree | bookdata | AVL树存放图书信息 |
string | manager | 用户名 |
string | key | 密码 |
成员函数 | 解释 | |
void fileread() | 文件信息读入 | |
void displaymenu() | 显示菜单 | |
bool enter() | 管理员登录 | |
void addbook() | 新书添加 | |
void consult() | 图书查询 | |
BNode* querybook() | 图书查找 | |
void renewbook() | 信息更新 | |
void cutbook() | 旧书删除 | |
void borbook() | 借书 | |
void backbook() | 还书 | |
void fileout() | 文件信息更新 |
表8 menu类设计
类之间的关系
程序中六个类之间是包含关系,menu类作为最外层的类,通过调用Btree类的函数来实现具体的功能,而Btree类又由BNode结点和filter布隆过滤器组成,BNode结点又通过bookinform类来存储图书信息,而bookinform类又包含borrowbook链表,且borrowbook链表又由node结点来存储单个借阅信息。
4.主程序的设计
主程序的设计基于命令台的交互界面。当运行程序的时候,首先会从本地文件夹中的bookdata.txt文件中读取文件中已经存储的图书信息并建立二叉树。然后程序进入主菜单,进行用户身份的选择:
图12 主界面展示
如果是管理员则进行登录:
图13 登录界面展示
然后根据用户权限的不同,分别显示管理员操作菜单与读者操作菜单。
图14 (a) 管理员操作菜单
图14 (b) 读者操作菜单
然后用户就可以根据功能界面的指示对系统进行各项操作。操作结束后可选择返回操作菜单或者退回主界面。
选择退出系统后将图书信息重新写入文件,实现文件信息更新。
在这里就先主要介绍一下具体的设计啦~ 源码的话后续可能会考虑以资源的形式发上来:)