数据结构课设--图书馆书籍管理系统

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

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

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

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

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的C语言图书馆管理系统的示例,包括图书管理和会员管理的基本功能: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_BOOKS 1000 #define MAX_MEMBERS 1000 // 图书结构体 typedef struct { char id[20]; // 书号 char name[50]; // 书名 char author[50]; // 第一作者 int edition; // 版次 char publisher[50]; // 出版社 int year; // 出版年 int borrowed; // 是否被借出 } Book; // 会员结构体 typedef struct { char id[20]; // 会员号 char name[50]; // 姓名 char phone[20]; // 电话 char email[50]; // 邮箱 char borrowed[20]; // 借阅的书号 } Member; Book books[MAX_BOOKS]; Member members[MAX_MEMBERS]; int bookCount = 0; int memberCount = 0; // 添加图书 void addBook() { if (bookCount >= MAX_BOOKS) { printf("Error: The library is full.\n"); return; } Book book; printf("Please enter the book information:\n"); printf("ID: "); scanf("%s", book.id); printf("Name: "); scanf("%s", book.name); printf("Author: "); scanf("%s", book.author); printf("Edition: "); scanf("%d", &book.edition); printf("Publisher: "); scanf("%s", book.publisher); printf("Year: "); scanf("%d", &book.year); book.borrowed = 0; books[bookCount++] = book; printf("The book has been added successfully.\n"); } // 查询图书 void searchBook() { char id[20]; printf("Please enter the book ID: "); scanf("%s", id); for (int i = 0; i < bookCount; i++) { if (strcmp(books[i].id, id) == 0) { printf("ID: %s\n", books[i].id); printf("Name: %s\n", books[i].name); printf("Author: %s\n", books[i].author); printf("Edition: %d\n", books[i].edition); printf("Publisher: %s\n", books[i].publisher); printf("Year: %d\n", books[i].year); if (books[i].borrowed) { printf("Status: Borrowed\n"); } else { printf("Status: Available\n"); } return; } } printf("Error: The book is not found.\n"); } // 删除图书 void deleteBook() { char id[20]; printf("Please enter the book ID: "); scanf("%s", id); for (int i = 0; i < bookCount; i++) { if (strcmp(books[i].id, id) == 0) { for (int j = i; j < bookCount - 1; j++) { books[j] = books[j + 1]; } bookCount--; printf("The book has been deleted successfully.\n"); return; } } printf("Error: The book is not found.\n"); } // 借阅图书 void borrowBook() { char id[20]; printf("Please enter the book ID: "); scanf("%s", id); for (int i = 0; i < bookCount; i++) { if (strcmp(books[i].id, id) == 0) { if (books[i].borrowed) { printf("Error: The book is already borrowed.\n"); } else { books[i].borrowed = 1; printf("The book has been borrowed successfully.\n"); } return; } } printf("Error: The book is not found.\n"); } // 归还图书 void returnBook() { char id[20]; printf("Please enter the book ID: "); scanf("%s", id); for (int i = 0; i < bookCount; i++) { if (strcmp(books[i].id, id) == 0) { if (books[i].borrowed) { books[i].borrowed = 0; printf("The book has been returned successfully.\n"); } else { printf("Error: The book is not borrowed.\n"); } return; } } printf("Error: The book is not found.\n"); } // 添加会员 void addMember() { if (memberCount >= MAX_MEMBERS) { printf("Error: The member list is full.\n"); return; } Member member; printf("Please enter the member information:\n"); printf("ID: "); scanf("%s", member.id); printf("Name: "); scanf("%s", member.name); printf("Phone: "); scanf("%s", member.phone); printf("Email: "); scanf("%s", member.email); member.borrowed[0] = '\0'; members[memberCount++] = member; printf("The member has been added successfully.\n"); } // 查询会员 void searchMember() { char id[20]; printf("Please enter the member ID: "); scanf("%s", id); for (int i = 0; i < memberCount; i++) { if (strcmp(members[i].id, id) == 0) { printf("ID: %s\n", members[i].id); printf("Name: %s\n", members[i].name); printf("Phone: %s\n", members[i].phone); printf("Email: %s\n", members[i].email); printf("Borrowed book ID: %s\n", members[i].borrowed); return; } } printf("Error: The member is not found.\n"); } // 删除会员 void deleteMember() { char id[20]; printf("Please enter the member ID: "); scanf("%s", id); for (int i = 0; i < memberCount; i++) { if (strcmp(members[i].id, id) == 0) { for (int j = i; j < memberCount - 1; j++) { members[j] = members[j + 1]; } memberCount--; printf("The member has been deleted successfully.\n"); return; } } printf("Error: The member is not found.\n"); } // 借阅信息 void borrowInfo() { char id[20]; printf("Please enter the member ID: "); scanf("%s", id); for (int i = 0; i < memberCount; i++) { if (strcmp(members[i].id, id) == 0) { printf("Borrowed book ID: %s\n", members[i].borrowed); return; } } printf("Error: The member is not found.\n"); } int main() { int choice; while (1) { printf("Please select the operation:\n"); printf("1. Add book\n"); printf("2. Search book\n"); printf("3. Delete book\n"); printf("4. Borrow book\n"); printf("5. Return book\n"); printf("6. Add member\n"); printf("7. Search member\n"); printf("8. Delete member\n"); printf("9. Borrow info\n"); printf("0. Exit\n"); printf("Your choice: "); scanf("%d", &choice); switch (choice) { case 1: addBook(); break; case 2: searchBook(); break; case 3: deleteBook(); break; case 4: borrowBook(); break; case 5: returnBook(); break; case 6: addMember(); break; case 7: searchMember(); break; case 8: deleteMember(); break; case 9: borrowInfo(); break; case 0: exit(0); default: printf("Error: Invalid choice.\n"); } } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值