数据结构图书馆管理系统Word格式文档下载.docx
- 文档编号:7309423
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:47
- 大小:225.29KB
数据结构图书馆管理系统Word格式文档下载.docx
《数据结构图书馆管理系统Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构图书馆管理系统Word格式文档下载.docx(47页珍藏版)》请在冰点文库上搜索。
typedefstructREADER{
longnumber;
//借阅号
charname[15];
//读者姓名
charsex;
//读者性别
charpassword[16];
//读者的密码
intresidue;
//读者的剩余可借书籍数量
longborrowed[10];
//读者已经借阅的书籍编号
intlimit;
//读者权限
structREADER*next;
//该结构体作为线性链表的一部分用来链接下一个节点的指针
}reader;
2)书籍
同读者信息一样,书籍也有很多信息需要描述,其中包含书籍的编码、书名、书籍作者、书籍的总量、书籍的可借数量、出版社信息、出版日期,整个全部我们定义一个reader类型的结构体,该结构体定义的代码如下:
typedefstructBOOK{
//书籍编号
charname[30];
//书名
charauthor[30];
//作者
charpress[30];
//出版社信息
longpresstime;
//出版日期
intexist;
//在库数量
inttotal;
//总数量
structBOOK*next;
//指向写一个节点的指针
}book;
3)数据链接
数据通过每个节点的“next”指针来链接,是单线性链表,只可以从头部查询数据,所以要记录好该链表的头结点位置,不要拿该节点的头结点参与运算,否则在程序中可能会修改该链表的头结点的信息,导致后续程序无法运行。
4)查询
查询书籍分为按书名查询、按书号查询和按作者查询。
按书名查询到的书籍我们设定为是唯一的,及整个书库中只有一种叫该名的书籍。
根据输入的书籍名,从书籍信息链表的首元节点开始遍历,若查找到则返回该书籍的指针,若没找到,则返回NULL。
按作者查询的书籍可能不止一种,一样从头结点开始遍历数据,每查到一个,则输出该书信息,并且继续往下查询,该函数没有返回者,读者可以根据查询到的数据,记下编号或者书名来进一步确认该书籍信息,然后借阅该书籍。
按书号查询,书号作为KEY值,在书籍里面是独一无二的,我们建立一个索引表,每两个key之间有5本书籍,这样根据所查书籍的书号可以确认该书在那个大概的区段,但后从该区段的首地址往下搜索最多5次便可确认该书的位置或者确认该书是否存在于该书库中。
查询读者信息读者登录之后可以查阅自己信息,从读者头结点开始往下查询,若查询到该读者,则返回该读者指针,并且显示该读者信息,若没有查找到,则返回NULL。
A、借阅模块:
函数声明:
voidborrow(reader*temp,book*Bhead);
//借书
说明:
Temp是该读者的指针,Bhead是该书籍链表的头指针。
该函数的流程图如下:
B、归还模块
voidreturnbook(book*bhead,reader*temp);
//还书
说明:
bhead是书籍链表的头指针,temp是借阅者的指针。
流程图如下:
C、插入模块
函数声明:
voidinsert(book*bhead);
//入库
bhead是书籍链表的头指针,流程图如下:
N
Y
三、算法设计
1、读者信息存储
读者信息采用线性单链表存储,设置头结点,头结点不存储数据,初始化时头结点->
next设置为空,然后每从文件中读取一组数据,则将该数据存入新开辟的空间,链接到读者信息链表中,再将该数据的next置空。
2、书籍信息存储
书籍信息存储采用单链表存储,设置头结点,头结点不存储数据,头结点的next为空,初始化时,从文件中读取一个格式化的数据,则将该数据存入新开辟的空间,并将该节点链接到链表中去,将next置空。
3、查找
查找分按书名查找、按作者查找和按书号查找。
按书名查找是采用遍历线性链表的方式,从首元结点开始向下遍历,检查输入的书名和已存的书名是否匹配,如果匹配,则将该书籍的指针返回,然后查找结束。
若直到最后也没找到,则返回空。
按作者查找则根据输入的作者名,从书籍链表的首元结点开始遍历,检查记录中的读者信息和输入的是否匹配,若找到匹配的,则输出该书籍信息,然后继续向下遍历,直到链表尾部,查找结束。
按书号查找则是根据建立的索引表来查找记录。
索引表是一个线性单链表,每个索引节点包含3个内容:
该索引的key值、该key值指向的书籍节点、该索引节点的下一个索引节点所在的位置。
设定书籍链表中每5本书籍取一个key值,从书籍链表的首元结点开始。
索引链表的头结点也为空,首元结点存储书籍链表的第一个记录的书号、第一个节点的位置和下一个索引节点的位置。
然后按书号查找时,先查找索引表,找到最近的入口,再从索引节点进入书籍节点,查找到该书籍,返回该书籍的指针。
按索引表在较大的数据查询时可以用空间换时间的方式减少查询时间,达到提高效率的结果。
但是这样分配新的节点需要占用空间,而且每次有新增书籍需要重新生成索引表,这样需要删除源节点空间,以免造成内存浪费。
四、详细程序清单
1、头文件定义
头文件library.h定义了3个结构体:
书籍结构体、读者结构体和索引表结构体,其中书籍结构体和索引表结构体已经给出,这里不再赘述,索引表结构体的定义如下:
typedefstructKEY{//索引表结点
longkey;
book*adress;
structKEY*next;
}keynode;
头文件还包含一些系统头文件的声明:
#include"
stdio.h"
string.h"
conio.h"
windows.h"
还有一些函数的声明,用#ifndef、#endif来包含,以免重复包含。
2、插入部分
插入部分分为书籍入库、读者注册、登陆3大块,分3个函数,声明如下:
voidreg(reader*head);
//注册
reader*login(reader*rhead,book*bhead);
//登陆
这3个函数分别实现新书入库、读者注册、登陆等功能,入库功能只有管理员才能调用,其余函数均可以调用,在主函数界面就可以。
3、读写模块
此模块主要实现向文件写入、读取数,主要是2个文件:
reader.txt、book.txt,分为4个函数:
读者读、写函数,书籍读、写函数。
定义如下:
book*Bload();
//书籍链表读取
reader*Rload();
//读者链表读入
voidBsave(book*Bhead);
//书籍信息链表写入
voidRsave(reader*Rhead,book*bhead);
//读者信息链表写入
读者和书籍链表的初始化就由读取函数完成,若文件为空则返回空指针,若不为空,则将文件里面的信息写入到链表中,每读出一个数据,分配一个空间,将该信息输入。
4、查找模块
查找模块分书籍查找模块、读者查找模块,书籍查找模块分线性链
遍历查询、索引表查询,读者查询直接遍历读者链表,查找该读者,若存在,返回指针,不存在则返回NULL。
查找模块的定义如下:
book*S_name(book*head,charname[]);
//按书籍名查找函数
voidS_author(book*head);
//按作者查找
keynode*initindex(book*head);
//初始化建立索引表
book*S_number(longnum,book*bhead);
//按书号查找
reader*S_reader(reader*rhead,longnum);
//查找读者
5、显示模块
根据给出的节点指针,显示该节点所包含的信息,显示分为读者显示和书籍信息显示,读者信息显示包含书籍信息显示,以便显示读者所借书的信息。
这两个函数的声明如下:
voidshowR(reader*tr,book*bhead);
//显示读者信息函数
voidshowB(book*p);
//显示书籍信息函数
这个模块还有2个小函数,用于将存入的性别’F’、’M’转化成汉字,将存的权限“1”、“0”转化成“管理员”、“读者”输出,这两个函数的定义如下:
char*sc(charp)
{
if(p=='
F'
||p=='
f'
)
return"
女"
;
else
男"
}
char*lc(inti)
if(i==1)
管理员"
读者"
6、风格函数
Style()这个函数用来设置运行的界面颜色,并调用时执行清屏。
还有密码保护函数,这个函数可以保护输入的密码不显示在界面上,不被别人看到,这个函数的定义如下:
voidintpsd(char*psd)//密码保护函数
{inti=0;
charc;
while((c=getch())!
=13)/*用getch()读入的回车值为13*/
{if(c!
='
\b'
&
&
c!
\t'
i<
20)
{psd[i]=c;
putchar('
*'
);
i++;
}
if(c=='
i>
0)
{printf("
\b\b"
i--;
}/*输出内容为退格,空格,退格;
擦掉一个字符*/
psd[i]='
\0'
return;
这个模块还有几个菜单界面,不再赘述。
五、程序运行结果
1、登陆界面
2、入库界面
3、借阅界面
4、还书界面
六、心得体会
这个程序设计大作业相对去年的程序设计大作业来说,难度有所提高,主要是使用了一些数据的处理方法,在数据的存储、调用、查找、排序灯方面都得到了充分的锻炼,巩固了数据结构的基本知识,加深了对C语言知识的巩固,并尝试了一些新的想法和思路,在整个程序设计过程中收获颇多。
在处理数据和程序代码方面都得到了很大的锻炼。
这次课程设计使我看到了很多不足,主要是对语言还理解不够透彻,一知半解等现象,也没有做出很漂亮的界面来支撑程序,而且个人感觉有些凌乱。
总之,这次程序设计大作业,感受颇多,今后还要继续努力!
七、参考文献
[1]严蔚敏,吴伟民.数据结构(C语言版).北京:
清华大学出版社,2010.3
[2]蒋清明,黄晓宇,向德生等.C语言程序设计.北京:
人民邮电出版社,2008.4
[3]李春葆等.数据结构教程(C语言版)。
北京:
清华大学出版社,2005.1
源码:
1、library.h
#ifndefLIBRARY_INCLUDE//条件编译防止重复包含
#defineLIBRARY_INCLUDE
time.h"
longnumber;
charname[30];
charauthor[30];
charpress[30];
longpresstime;
intexist;
inttotal;
structBOOK*next;
typedefstructKEY{
charname[15];
charsex;
charpassword[16];
intresidue;
longborrowed[10][2];
intlimit;
structREADER*next;
//以下是函数声明
char*lc(inti);
//将权限转换成可显示易理解的汉字
char*sc(charp);
//将性别转换成可现实易理解的文字
voiddelkey(keynode*keyhead);
voidinsert(book*bhead);
voidstyle();
//风格函数
voidintpsd(char*psd);
//密码保护函数
voidmenu(structBOOK*Bhead,reader*Rhead);
//菜单
voidmenu2(reader*temp,reader*rhead,book*bhead);
longbacktime();
//结束时间
#endif
2、borrow_return.cpp
library.h"
//借阅
voidborrow(reader*temp,book*Bhead)
style();
longnum;
inti;
chart,k,name[30];
book*Bbook;
while
(1)
{
printf("
\n┏━━━━━━━━━━┓"
\n█━━━━━━━━━━━┫欢迎使用借阅系统┣━━━━━━━━━━━█"
\n┗━━━━━━━━━━┛"
\n请输入您要查找借阅书籍的方式:
"
\n1、按书号查找\n"
\n2、按作者查找\n"
\n3、按书名查找\n"
\n4、返回主菜单\n"
t=getch();
switch(t)
{
case'
1'
:
printf("
\n请输入您要查找的书籍编号:
scanf("
%d"
&
num);
if((Bbook=S_number(num,Bhead))!
=NULL)
{
showB(Bbook);
printf("
\n请问你是否要借阅该书籍?
Y/N"
k=getch();
if(k=='
Y'
||k=='
y'
gotoborrow;
else
break;
}
else
break;
}
2'
S_author(Bhead);
break;
3'
\n请输如您要查找的书籍名:
%s"
name);
if((Bbook=S_name(Bhead,name))!
continue;
default:
return;
borrow:
if(Bbook!
=NULL&
temp->
residue>
0&
Bbook->
exist>
temp->
residue--;
Bbook->
exist--;
for(i=0;
i<
10;
i++)
if(temp->
borrowed[i][0]==0)
{
temp->
borrowed[i][0]=Bbook->
number;
borrowed[i][1]=backtime();
}
\n借阅成功!
else
if(!
(temp->
0))
\n您只能借阅10本书籍!
if(!
(Bbook->
printf("
\n该书没有库存,请借阅其他书籍!
\n您要继续借阅书籍吗?
if(t=='
||t=='
continue;
break;
voidreturnbook(book*bhead,reader*temp)//还书
inti,j=0;
chart;
book*p;
printf("
\n█━━━━━━━━━━━┫欢迎使用还书系统┣━━━━━━━━━━━█"
\n\n请输入您所还书的编号:
scanf("
for(i=0;
if(num==temp->
borrowed[i][0])
j=1;
p=S_number(num,bhead);
if(p!
j==1)
\n┌────┬──────┬───────┬────┬───────┐"
\n│书本编号│书籍名称│出版社名称│出版时间│作者│"
\n├────┼──────┼───────┼────┼───────┤"
\n│%8d│%12s│%14s│%8d│%14s│"
p->
number,p->
name,p->
press,p->
presstime,p->
author);
\n└────┴──────┴───────┴────┴───────┘\n"
\n确认归还该书籍?
p->
exist++;
residue++;
borrowed[i][0]==num)
borrowed[i][0]=0;
borrowed[i][1]=0;
elsereturn;
\n编号有误,请仔细检查!
3、insert.cpp
#include"
voidinsert(book*bhead)//入库
longt;
book*temp1,*temp,*temp2;
temp1=bh
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 图书馆 管理 系统