版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、源代码/功能:图书管理系统/作者:黄成勇/时间:2012.12.04#include /*辅助库函数*/#include /*输入输出函数*/#include /*控制台输入输出函数getch*/#include math.h#include memory.h#include string.h#define book_data e:book.txt#define reader_data e:reader.txt struct Date /*日期结构*/ int m_nYear; /*年*/ int m_nMonth; /*月*/ int m_nDay; /*日*/ ;typedef struc
2、t Date date;struct Reader /*读者结构*/char rname10;/*读者姓名*/char num20; /*借书证号*/struct Date bro; /*借出时间*/ struct Date back; /*归还时间*/ ;typedef struct Reader reader;struct Book /*书本结构*/int m_iBook_Number; /*对应书本号*/ char m_strTitle15; /*书名*/char m_strWroter15; /*作者*/ int m_nMoreNum; /*当前在架册数*/ int m_nTotalH
3、oldNum; /*馆藏册数*/ char m_strComment30; /*图书简介*/ struct Reader reader5; ;typedef struct Book book;struct Info /*借书信息结构*/struct Info *m_pParentPoint; /*前驱结点*/ struct Book *m_pBookInfo; /*对应书本的信息*/ struct Info *m_pSun; /*后继结点*/;typedef struct Info info;struct Book *InputNode(struct Info *bth);/*添加书本信息*/
4、void check(info * bth); /*测试链表长度*/struct Info *Search(struct Info *bth,int x,int *k,int *flag);/*查找图书*/struct Info *Insert_BookInfo(struct Info *bth); /*图书上架*/struct Info *Delete_BookInfo(struct Info *bth); /*图书下架*/void Output_BookInfo(struct Info *bth); /*打印输出书本信息*/void Borrow_TheBook(struct Info *
5、bth); /*图书出借*/void TurnBack_TheBook(struct Info *bth); /*图书归还*/void All_TheBook(struct Info *bth); /*全部图书*/void All_TheReader(struct Info *bth); /*全部读者*/void Save_Data(struct Info *bth); /*保存信息*/struct Info* Load_Data(void); /*加载信息*/char Select_Menu(); /*图书馆管理系统主菜单*/int sums=0;/*图书查找*/struct Info *S
6、earch(struct Info *bth,int x,int *k,int *flag)struct Info *p=NULL;/*当前工作指针*/p=bth; /*每次查询前,将工作指针指向双向链表头部结点*/*flag=0; /*是否查找到指定书本号的标志,初始化置为0*/while(p)if(p-m_pBookInfo-m_iBook_Number=x)/*找到相同的书号,置找到的标志*/*flag = 1;return p;else/*未找到相同的书号,置未找到标志*/*flag = 0;if(p-m_pSun!=NULL)p = p-m_pSun;/*没到双向链表的尾部时,向后移
7、动当前指针*/elsebreak;/*到达链表尾部,跳出循环*/return bth;/*输入图书信息*/struct Book *InputNode(struct Info *bth)struct Book *p=NULL;int i;p=(struct Book *)malloc(sizeof(struct Book); /*分配内存*/system(cls);/*清屏*/fflush(stdin); /*清除以前的输入*/printf(nt请输入书名: ); gets(p-m_strTitle);/*从键盘取得书名*/printf(nt请输入作者: );gets(p-m_strWrote
8、r);/*从键盘取得作者名*/printf(nt请输入当前在架册数: );scanf(%d,&p-m_nMoreNum);/*从键盘取得当前在架册数*/printf(nt请输入馆藏册数: );scanf(%d,&p-m_nTotalHoldNum);/*从键盘取得当前馆藏册数*/fflush(stdin);printf(nt请输入本书简介: );/*从键盘取得本书内容简要介绍*/gets(p-m_strComment);/*以上从输入输出设备取得要求的信息*/for(i=0;ireaderi).num0=0;/*初始化书本结构成员的相关读者指针内容为空*/return(p); /*返回成功插入
9、的一本书信息*/*图书上架*/struct Info *Insert_BookInfo(struct Info *bth)int flag,j,k,t;int y,x,z;struct Info *p=NULL,*q=NULL,*u=NULL,*s=NULL;struct Book *r=NULL,*l=NULL;system(cls);/*清屏*/printf(nt请输入你想上架的书本号: );scanf(%d,&x);/*取书号*/ q=Search(bth,x,&k,&flag);/*查找上架的书是否已经上架,返回已经找到的书的信息*/if(flag=1) /*查找成功,存在此书*/pr
10、intf(nt当前存在这本书%d本,您想再增加一本书?(y/n)n,q-m_pBookInfo-m_nTotalHoldNum,q-m_pBookInfo-m_strTitle);z=getch();if(z=y|z=Y) /*确认上架另一本书*/printf(nt本馆此书一共有: %d 本,q-m_pBookInfo-m_nTotalHoldNum);printf(nt并且有: %d 本在图书馆中内未借出.,q-m_pBookInfo-m_nMoreNum);q-m_pBookInfo-m_nTotalHoldNum+;q-m_pBookInfo-m_nMoreNum+; printf(nt
11、上架后一共有: %d 本,q-m_pBookInfo-m_nTotalHoldNum);printf(nt上架后当前有: %d 本在图书馆中.,q-m_pBookInfo-m_nMoreNum);memset(p-m_pBookInfo-reader-num,0,sizeof(p-m_pBookInfo-reader-num);/使nun为空,用于借书读者判断Save_Data(bth);return(bth); r=InputNode(bth); /*成功插入书本信息,指针r存放刚刚插入的书本*/if(bth=NULL) /*指针bth为空时,表示当前链表为空,此时需要单独处理,即链表头内存
12、分配*/bth=p=(struct Info *)malloc(sizeof(struct Info);/*申请内存*/r-m_iBook_Number = x;/*将书号存入书本信息结构体*/p-m_pParentPoint= NULL;/*前驱结点置空*/p-m_pSun=NULL;/*后继结点置空*/p-m_pBookInfo=r;memset(p-m_pBookInfo-reader-num,0,sizeof(p-m_pBookInfo-reader-num);Save_Data(bth);return(p); /*返回新成功插入的书本结点*/ else/*说明已经有头指针,则在此开始
13、处理新插入的结构体指针*/p=NULL; p=bth;while(p-m_pSun!=NULL)p = p-m_pSun;/*当后继结点不为空时,表示还未到链表尾部*/*当循环结束后,p指向的就是最后一个结点*/q=(struct Info *)malloc(sizeof(struct Info);/*申请内存*/r-m_iBook_Number = x;/*将书号存入书本信息结构体*/p-m_pSun = q; /*双向链表的前驱与后继结点链接*/q-m_pParentPoint= p;q-m_pSun=NULL;q-m_pBookInfo=r;/*指向新插入的书本信息结构体*/q-m_pB
14、ookInfo-reader-bro.m_nYear=0;memset(q-m_pBookInfo-reader-num,0,sizeof(q-m_pBookInfo-reader-num);Save_Data(bth); return(bth); /*图书下架*/struct Info *Delete_BookInfo(struct Info *bth)int flag,j,k,t;int x,y;struct Info *u=NULL,*s=NULL,*p=NULL,*q=NULL;struct Book *bookinfo=NULL;struct Info *BookLeftPoint=
15、NULL;/*前驱结点*/struct Info *BookRightPoint = NULL;/*后继结点*/system(cls);/*清屏*/printf(nt请输入你想下架的书本号: );scanf(%d,&x);/*接受输入*/q=Search(bth,x,&k,&flag);/*查找指定的书是否存在*/ if(flag=0) /*书本不存在是,直接输出消息并返回*/printf(nt这本书不存在!n); return(bth); elseif(q=NULL)printf(未知错误);return bth;/*确保当前工作指针是有效的,防止出现非法操作*/elsebookinfo=q
16、-m_pBookInfo;printf(nt想下架的书本信息: ); printf(nt书名: %s,bookinfo-m_strTitle); printf(nt作者: %s,bookinfo-m_strWroter);printf(nt当前在架册数: %d,bookinfo-m_nMoreNum);printf(nt馆藏册数: %d,bookinfo-m_nTotalHoldNum);printf(nt本书简介: %sn,bookinfo-m_strComment);printf(nt你想退出系统 ?(y/n); t=getch(); if(t=y|t=Y) system(cls);/*清
17、屏*/printf(nt图书下架成功!n);if(q-m_pParentPoint!=NULL & q-m_pSun!=NULL)/*夹在链表中间的结点*/BookLeftPoint = q-m_pParentPoint;BookRightPoint = q-m_pSun;/*要删除的结点的后继指向赋给后继结点的指针变量*/BookLeftPoint-m_pSun = BookRightPoint;BookRightPoint-m_pParentPoint = BookLeftPoint;q-m_pParentPoint = NULL;q-m_pSun = NULL;free(q-m_pBoo
18、kInfo);/*先将书本信息结构体的内存释放*/q-m_pBookInfo = NULL;/*使指针指向安全地址*/free(q);q = NULL;Save_Data(bth);return bth;/*返回首结点*/else if(q-m_pParentPoint=NULL)/*首结点的前驱为空,这里处理首结点删除操作*/if(q-m_pSun=NULL)/*前后指针域均为空时,说明只有一个结点,此时只需要将此结点删除*/free(q-m_pBookInfo);q-m_pBookInfo = NULL;free(q);q = NULL;return q;bth = q-m_pSun;bt
19、h-m_pParentPoint = NULL;BookRightPoint = q;BookRightPoint-m_pParentPoint = NULL;/*将链表中指向首结点的后继指针的前驱指针域置为空,表明是新的首结点*/BookRightPoint-m_pSun = NULL;free(BookRightPoint-m_pBookInfo);BookRightPoint-m_pBookInfo = NULL;/*使指针指向安全地址*/free(BookRightPoint);BookRightPoint = NULL;Save_Data(bth);return bth;/*返回首结
20、点*/else if (q-m_pSun=NULL)BookLeftPoint = q-m_pParentPoint; /*将要删除的结点即尾结点的前驱域保存到前驱指针变量中*/BookLeftPoint-m_pSun = NULL;q-m_pParentPoint = NULL;free(q-m_pBookInfo);/*先将书本信息结构体的内存释放*/q-m_pBookInfo = NULL;free(q);/*将要删除的借还书信息结构体指针使用的内存空间释放*/q = NULL;Save_Data(bth);return bth;/*返回首结点*/*查找输出书本信息*/void Outp
21、ut_BookInfo(struct Info *bth)struct Info *q=NULL;struct Book *p=NULL;int k=0;int x=0;int flag=0;system(cls);printf(nt请输入你想查找的书本号: );scanf(%d,&x);q=Search(bth,x,&k,&flag); if(flag=1)p=q-m_pBookInfo;printf(nt书名: %s,p-m_strTitle); printf(nt作者: %s,p-m_strWroter);printf(nt当前在架册数: %d,p-m_nMoreNum);printf(
22、nt馆藏册数: %d,p-m_nTotalHoldNum);printf(nt本书简介: %sn,p-m_strComment);else printf(nt这本书不存在!);/*图书借出*/void Borrow_TheBook(struct Info *bth)struct Info *q=NULL;struct Book *p=NULL;int i,k, x, flag,t;system(cls);/*清屏*/printf(nt请输入你想借的书本号: );/*打印消息*/scanf(%d,&x);/*接受输入*/q=Search(bth,x,&k,&flag); /*查找书本*/if(f
23、lag=1) p=q-m_pBookInfo;printf(nt借出这本书 ?(y/n);printf(nt书名: %s,p-m_strTitle);printf(nt作者: %s,p-m_strWroter);printf(nt当前在架册数: %d,p-m_nMoreNum);printf(nt馆藏册数: %d,p-m_nTotalHoldNum);printf(nt本书简介: %sn,p-m_strComment);t=getch();if(t=y|t=Y)/*确认借这本书*/if( (p-m_nMoreNum)=0) printf(nt对不起,本书已经全部借出.);else/system
24、(cls);for(i=0;ireaderi).num0=0) break;printf(nt请输入姓名: ); scanf(%s,(p-readeri).rname);printf(nt请输入借书证号: ); scanf(%s,(p-readeri).num);printf(nt请输入借出的日期: ); printf(nt年: );scanf(%d,&(p-readeri).bro.m_nYear);printf(t月: );scanf(%d,&(p-readeri).bro.m_nMonth);printf(t日: );scanf(%d,&(p-readeri).bro.m_nDay);p
25、rintf(nt请输入归还日期: );printf(nt年: );scanf(%d,&(p-readeri).back.m_nYear);printf(t月: );scanf(%d,&(p-readeri).back.m_nMonth);printf(t日: );scanf(%d,&(p-readeri).back.m_nDay);p-m_nMoreNum-; getchar();printf(nt成功借到本书.);Save_Data(bth); else printf(nt这本书不存在!); /*图书归还*/void TurnBack_TheBook(struct Info *bth)str
26、uct Info *q=NULL;struct Book *p=NULL;int i,k, x, flag,t,j;int year,month,day,d;float pay;char temp20;system(cls);/*清屏*/printf(nt请输入归还的书本号: );scanf(%d,&x);q=Search(bth,x,&k,&flag); /*书本查找*/ if(flag=1)/*找到本书*/p=q-m_pBookInfo;printf(nt书名: %s,p-m_strTitle);printf(nt作者: %s,p-m_strWroter);printf(nt当前在架册数:
27、 %d,p-m_nMoreNum);printf(nt馆藏册数: %d,p-m_nTotalHoldNum);printf(nt本书简介: %sn,p-m_strComment);printf(nt你想归还这本书 ?(y/n);t=getch();/*接受选择*/if(t=y|t=Y)/*确认归还这本书*/if( (p-m_nMoreNum) =(p-m_nTotalHoldNum) )printf(nt想再上架一本书吗 ?n);elsesystem(cls);printf(nt请输入借书证号: );scanf(%s,temp);j=0;for(i=0;ireaderi).num) j=1;b
28、reak; if(j=0) printf(nt你未借此书书!n);return; printf(nt今天是:); printf(nt年: );scanf(%d,&year);printf(t月: );scanf(%d,&month);printf(t日: );scanf(%d,&day);d=0;if(yearreaderi).back.m_nYear) d=1; if(yearreaderi).back.m_nYear & monthreaderi).back.m_nMonth) d=1;if(yearreaderi).back.m_nYear & monthreaderi).back.m_
29、nMonth & dayreaderi).back.m_nDay) d=1;if(d=0)/*超过还书日期,在此还书*/system(cls);pay=(year-(p-readeri).back.m_nYear)*365+(month-(p-readeri).back.m_nMonth)*30+(day-(p-readeri).back.m_nDay);printf(nt你的借书日期是: %d-%d-%d,(p-readeri).bro.m_nYear,(p-readeri).bro.m_nMonth,(p-readeri).bro.m_nDay); printf(nt你的还书日期是: %d
30、-%d-%d之前,(p-readeri).back.m_nYear,(p-readeri).back.m_nMonth,(p-readeri).back.m_nDay);printf(nt今天是 %d-%d-%d,year,month,day);printf(nnt因此你超出借期,);printf(nt应该支付%2.1f 元罚款.,0.1*pay); (p-readeri).num0=0; p-m_nMoreNum+; printf(nt你已经归还了这本书.);Save_Data(bth);else printf(nt你不能归还不存在的一本书!); /*输出全部图书*/void All_The
31、Book(struct Info *bth)int i;struct Info *p=NULL,*q=NULL;struct Book *l=NULL;system(cls);p=bth;printf(书本号t 书名t 作者t 可借数t 馆藏数t 图书简介n);if(p!=NULL)dol=p-m_pBookInfo;printf(%dt %st %st %dt %dt %st n,l-m_iBook_Number,l-m_strTitle,l-m_strWroter,l-m_nMoreNum,l-m_nTotalHoldNum,l-m_strComment);p=p-m_pSun;/链表指针
32、指向下一后继结点while(p!=NULL);elseprintf(n 无图书信息! n);/*全部读者*/void All_TheReader(struct Info *bth)int i;struct Info *p=NULL,*q=NULL;struct Book *l=NULL;system(cls);p=bth;printf(姓名t 借书证号t 书名t 借书日期t 应归还日期t n);if(p!=NULL)while(p!=NULL)if(strcmp(p-m_pBookInfo-reader-num,)!=0)/判断nun是否为空l=p-m_pBookInfo;printf(%st
33、 %st %st %d年%d月%d日t %d年%d月%d日 n,l-reader-rname,l-reader-num,l-m_strTitle,l-reader-bro.m_nYear,l-reader-bro.m_nMonth,l-reader-bro.m_nDay,l-reader-back.m_nYear,l-reader-back.m_nMonth,l-reader-back.m_nDay);p=p-m_pSun;elseprintf(n 无读者信息! n);/*保存数据*/void Save_Data(struct Info *bth)int i=0;struct Info *p=
34、NULL,*q=NULL;struct Book *l=NULL;FILE *fp;/文件指针p=bth;system(cls);fp=fopen(book_data,w+);/fopen打开文件函数,w+打开可读写文件rewind(fp);/将文件内部的位置指针重新指向一个流(数据流/文件)的开头q=(info*)malloc(sizeof(info);/*info内存申请*/q-m_pBookInfo=(book*)malloc(sizeof(book);/*book内存申请*/if(p!=NULL)while(p!=NULL)fwrite(p-m_pBookInfo,sizeof(boo
35、k),1,fp);/fwite向文件写入一个数据块,(数据地址,单字节数,写入的数据项个数,目标文件指针)p=p-m_pSun;/链表指针指向下一后继结点i+;if(i=0)printf(n 没有保存数据!n);fclose(fp);/关闭文件elseprintf(n 保存成功!n);printf(nt共保存了%d组数据!n,i);fclose(fp);elseprintf(n 没有数据需要存储!n);fclose(fp);fclose(fp);void check(info * bth);/*加载数据*/struct Info* Load_Data(void)int i=0,j=0,k;st
36、ruct Info *p=NULL,*q=NULL,*bth=NULL;struct Book *l=NULL;FILE *fp;system(cls);fp=fopen(book_data,r+);rewind(fp);p=(struct Info *)malloc(sizeof(struct Info);/*info申请内存*/p-m_pBookInfo=(book*)malloc(sizeof(book);/*book申请内存*/while(fread(p-m_pBookInfo,sizeof(book),1,fp)!=NULL)/从文件流中读出的数据不为空if(i=0)bth=p;el
37、seq-m_pSun=p;/将后继节点接上p-m_pParentPoint=q;q=p;q-m_pSun=NULL;p=(struct Info *)malloc(sizeof(struct Info);/*申请内存*/p-m_pBookInfo=(book*)malloc(sizeof(book);j+;i+;if(j=0)printf(n 没有数据信息可载入! n);bth=NULL;free(p);elseprintf(n 载入成功! n);printf(nt一共载入%d组数据n,j);fclose (fp);/check(bth);return bth;/*主菜单显示函数*/char Select_Menu()system(cls); printf(nnntt*n); printf(tt* *n); printf(tt* 图 书 馆 管 理 系 统 *
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理就业指导与职业发展
- 护理教学中的问题导向学习
- 护理工作标准化流程汇报
- 护理实习科研入门
- 口腔护理与社区健康
- 护理心理学与心理评估
- 动脉粥样硬化预防措施效果评价
- 客户关系策略及沟通技巧总结
- 快消品企业会计工作常见问题及解答
- 基于云计算的大规模数据处理研究
- MOOC 研究生学术规范与学术诚信-南京大学 中国大学慕课答案
- 老年人中医药养生健康知识讲座
- 第六章中华民族的抗日战争课件
- 法律英语(何家弘编-第四版)课文翻译(1-20课)
- 见习材料热处理工程师考试
- 出差申请单表
- 市政隧道盾构工程施工质量验收表格
- 高分辨率遥感
- 2023学年完整公开课版秦统一六国
- 怀孕手册、孕妇手册、生育指南
- 电厂石灰石浆液制备系统设备安装施工方案
评论
0/150
提交评论