这是很久之前做的一个课设了,主要使用平衡二叉树(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) 读者操作菜单

然后用户就可以根据功能界面的指示对系统进行各项操作。操作结束后可选择返回操作菜单或者退回主界面。

选择退出系统后将图书信息重新写入文件,实现文件信息更新。

在这里就先主要介绍一下具体的设计啦~  源码的话后续可能会考虑以资源的形式发上来:)

Logo

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

更多推荐