1、数据结构小组实验利用链表实现图书管理系统小组实验报告组号: 得分:_一、问题描述 (清楚阐述要解决的问题)建立图书管理系统,实现:1.新书入库2.旧书删除3.更新书目4.图书借出5.图书归还6.借出书目统计7.按一定要求输出书库图书 (1)全部输出 (2)输出某类型图书 (3)输出某作者图书 二、问题分析(分析问题特点,讨论解决方法)1.建立图书管理系统,我们首先要讨论图书本身所包含哪些信息,这里选取书号,书名,作者,类型,现存量和总存量五个比较重要的信息进行处理;2.其次,我们要讨论如何存放书目,这里选取带头结点的单链表形式,方便图书的插入与删除操作;3.最后运用链表的基本操作实现基本的图书
2、管理操作。三、算法描述(采用自然语言描述选定的解决方案)1.创建含有书号,书名,作者,类型,现存量,总存量和指针的一个结构类型;2.创建一个带头结点的链表;3.新书入库:从键盘读取信息存入新书节点中,将新书节点插入链表尾部;4.旧书删除:我们提供两种删除方式,按书号和书名,具体操作为:从头结点后开始,依次寻找指定书目,如果找到,删除该书目节点,并告知操作者删除成功,如果没能找到,则告知操作者无该图书;5.更新书目:从头结点开始,向下寻找指定书目,若找到,根据操作者需要更改图书信息,并提示更改信息成功,若没有,提示操作者无该书;6.图书借出:从头结点开始,向下寻找指定书目,若找到且现存量大于0,
3、将该书现存量减一,并提示操作者图书借阅成功,若找到但现存量为0,则提示存量不足借阅失败,若没有找到,提示操作者无该书;7.图书归还:从头结点开始,向下寻找指定书目,若找到图书且现存量小于总库存,则现存量加一,提示归还成功,若找到图书且现存量小于总库存,则提示无图书借出归还失败,若没有找到,则提示无该图书归还失败;8.借出书目统计:输出所有现存量小于总存量的书目信息;9.按一定要求输出书库图书 (1)全部输出:遍历输出; (2)输出某类型图书:遍历链表,如果输入图书类型与该图书类型相同,则输出该图书信息;(3)输出某作者图书:遍历链表,如果输入作者与该图书作者相同,则输出该图书信息;四、详细设计
4、(画出程序流程图)五、程序代码(对关键语句或程序中的亮点设计给出必要注释)#include#include#includetypedef struct BookNode int booknum; /书号 char bookname15; /书名 char writer20; /作者名字 char booktype20; /图书类型 int current; /现存量 int total; /总库存 struct BookNode *next; BookNode,*Link;typedef struct LinkList Link head;/头结点 int lenth;/链表中数据元素的个数
5、LinkList;int newwarehouse(LinkList *library) int booknum; char bookname15; char writer20; char booktype20; int total; printf(请输入新书信息:书号,书名,作者名字,图书类型,总库存n); scanf(%d %s %s %s %d,&booknum,bookname,writer,booktype,&total); Link pre=NULL; Link p=NULL; pre=library-head; while(pre-next!=NULL) pre=pre-next
6、; p = (Link)malloc(sizeof(BookNode); p-booknum=booknum; strcpy(p-bookname,bookname); strcpy(p-writer,writer); strcpy(p-booktype,booktype); p-current=total; p-total=total; p-next = NULL; pre-next = p; printf(新书入库成功n); return 1;int deletebook1(LinkList *library,int num) int e=1; Link p,pre; pre = libr
7、ary-head; p=pre-next; while(p!=NULL) if(num=p-booknum) pre-next=p-next; free(p); printf(图书删除成功n); e=0; else pre=p; p=p-next; if(e=1)printf(无此图书信息n); return 1;int deletebook2(LinkList *library,char name15) int e=1; Link p,pre; pre = library-head; p=pre-next; while(p!=NULL) if(strcmp(name,p-bookname)=
8、0) pre-next=p-next; free(p); printf(图书删除成功n); e=0; else pre=p; p=p-next; if(e=1)printf(无此图书信息n); return 1;void modify(LinkList *library) char name15; int e=1; int c; Link p,pre; pre = library-head; p=pre-next; printf(请输入要修改的书名:n); scanf(%s,name); while(p!=NULL&e=1) if(strcmp(p-bookname,name)=0) prin
9、tf(n请选择要修改的项:); printf(n 1.修改图书编号n); printf(n 2.修改图书作者n); printf(n 3.修改图书类型n); printf(n 4.修改图书库存量n); scanf(%d,&c); switch(c) case 1: printf(n 请输入新的图书编号:); scanf(%d,&p-booknum); break; case 2: printf(n 请输入新的图书作者:); scanf(%s,p-writer); break; case 3: printf(n 请输入新的图书类型:); scanf(%s,p-booktype); break;
10、case 4: printf(n 请输入新的图书库存量:); scanf(%d,&p-total); p-current=p-total; break; printf(nt该项已成功修改。nt 新的图书信息:); printf(书号:%d 书名:%s 作者名字:%s 图书类型:%s 总库存:%dn,p-booknum,p-bookname,p-writer,p-booktype,p-total); e=0; p = p-next; if(e=1) printf(nt暂无此图书信息。); getch();int borrow(LinkList *library,char name15) int
11、e=1; Link p; p = library-head-next; while(p!=NULL) if(strcmp(name,p-bookname)=0&p-current0) p-current=p-current-1; printf(图书借阅成功,现存量减一n); e=0; break; else if(strcmp(name,p-bookname)=0&p-current=0) printf(图书库存不足,借阅失败n); e=0; break; else p=p-next; if(e=1)printf(无该图书,借阅失败n); return 1;int giveback(LinkL
12、ist *library,char name15) Link p; int e=1; p = library-head-next; while(p!=NULL) if(strcmp(name,p-bookname)=0&p-currenttotal) p-current=p-current+1; printf(图书归还成功,现存量加一n); e=0; break; else if(strcmp(name,p-bookname)=0&p-current=p-total) printf(该图书无借出,归还失败n); e=0; break; else p=p-next; if(e=1)printf(
13、无该图书,归还失败n); return 1;void statistics(LinkList *library) int i=0; Link p; p=library-head-next; while(p!=NULL) if(p-currenttotal) printf(书号:%d 书名:%s 作者名字:%s 图书类型:%s 现存量:%d 总库存:%dn,p-booknum,p-bookname,p-writer,p-booktype,p-current,p-total); i+; p=p-next; if(i=0)printf(暂无图书出借n);void show1(LinkList *li
14、brary) Link p; p=library-head-next; printf(书号 书名 作者名字 图书类型 现存量 总库存n); while(p!=NULL) printf(%d %s %s %s %d %dn,p-booknum,p-bookname,p-writer,p-booktype,p-current,p-total); p=p-next; void show2(LinkList *library) int i=0; char name15; printf(请输入作者名字:); scanf(%s,name); Link p; p=library-head-next; pri
15、ntf(书号 书名 作者名字 图书类型 现存量 总库存n); while(p!=NULL) if(strcmp(name,p-bookname)=0) printf(%d %s %s %s %d %dn,p-booknum,p-bookname,p-writer,p-booktype,p-current,p-total); i+; p=p-next; if(i0)printf(按要求共找到%d本书n,i); if(i=0)printf(无该作者图书n);void show3(LinkList *library) int i=0; char type20; printf(请输入图书类型:); s
16、canf(%s,type); Link p; p=library-head-next; printf(书号 书名 作者名字 图书类型 现存量 总库存n); while(p!=NULL) if(strcmp(type,p-booktype)=0) printf(%d %s %s %s %d %dn,p-booknum,p-bookname,p-writer,p-booktype,p-current,p-total); i+; p=p-next; if(i0)printf(按要求共找到%d本书n,i); if(i=0)printf(无此类图书n);void Show (LinkList *libr
17、ary) int c; printf(请问你想按什么要求输出:n1.输出书库中所有书目 3.输出某作者的全部书目 4.输出某类型全部书目n); scanf(%d,&c); switch(c) case 1:show1(library);break; case 2:show2(library);break; case 3:show3(library);break; default : printf(n输入有误!n); LinkList *Initialize (LinkList *NewList) Link temp,p,q; NewList=(LinkList *)malloc(sizeof(
18、LinkList); temp=(Link)malloc(sizeof(BookNode); temp-booknum=0; temp-next=NULL; NewList-head=temp; NewList-lenth=0; return NewList;int main() LinkList *library=NULL; library=Initialize (library); int n,num=0; char name15; int choice=1; printf(欢迎使用图书管理系统(*)nn); while(choice) printf(请输入你想进行的操作之前的序号:n1.
19、新书入库 2.删除图书n3.更新书目 4.图书借出n5.图书归还 6.统计借出书目n7.按一定要求输出书库图书n0.退出nn); printf(操作:); scanf(%d,&choice); system(cls); if(choice=1)newwarehouse(library); if(choice=2) printf(请问你想根据以下哪种方法删除书目:n1.书号 2.书名n) ; scanf(%d,&n); if(n=1) printf(请问你想删除书目的书号是n) ; scanf(%d,&num); deletebook1(library,num); if(n=2) printf(
20、请问你想删除书目的书名是n) ; scanf(%s,&name); deletebook2(library,name); if(choice=3)modify(library); if(choice=4) printf(请问需要借阅书目的书名是n) ; scanf(%s,name); borrow(library,name); if(choice=5) printf(请问需要归还书目的书名是n) ; scanf(%s,name); giveback(library,name); if(choice=6)statistics(library); if(choice=7)Show(library)
21、; if(choice=0)printf(感谢您的使用,祝您生活愉快(*)n); if(choice7)printf(抱歉,您的输入错误,请重新输入n); printf(nn); return 0;六、测试和结果(给出测试用例,并给出测试结果)1.初始界面2.新书入库3.旧书删除4.更新书目5.图书借出6.图书归还7.借出书目统计8.按一定要求输出书库图书(1)全部输出 (2)输出某类型图书 (3)输出某作者图书9.退出七、用户手册(告诉用户如何使用程序,使用注意事项等)1.该管理系统没有预先设置书目,如需使用后续功能请务必先进行新书入库操作;2.新书入库时系统无法检测输入重复的情况(考虑到每次输入都遍历比较再录入的话程序效率会大大变低),切勿输入书号或书名相同的书目;3.应需要录入信息较多,使用者输入时需注意不要输错数据类型,以免程序出现错误。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1