数据结构课设--图书馆书籍管理系统
就是对于每一个子树来说,左子节点的值小于父节点,右子节点的值大于父节点,并且在BST树的基础上为每个节点添加了平衡因子和树高来判断树的平衡性,通过保证所有节点的左子树和右子树的高度差不大于1来保证树的平衡,从而提高查找、插入和删除等操作的效率。输入书的基本信息来添加新书,如果库中已经有该书,则更新该书的现存量,如果原来没有,则添加新的节点,并重新平衡AVL树。先查找对应书籍, 然后通过学号查找对应
这是很久之前做的一个课设了,主要使用平衡二叉树(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) 读者操作菜单
然后用户就可以根据功能界面的指示对系统进行各项操作。操作结束后可选择返回操作菜单或者退回主界面。
选择退出系统后将图书信息重新写入文件,实现文件信息更新。
在这里就先主要介绍一下具体的设计啦~ 源码的话后续可能会考虑以资源的形式发上来:)

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)