数据结构图书管理系统.docx
- 文档编号:12284140
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:23
- 大小:369.78KB
数据结构图书管理系统.docx
《数据结构图书管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构图书管理系统.docx(23页珍藏版)》请在冰豆网上搜索。
数据结构图书管理系统
图书管理系统
1.问题描述及基本要求
图书管理系统
基本要求:
(1)每种书的登记内容包括书号、书名、著作者、现存量和库存量。
(2)对书号建立索引表以提高查找效率。
(3)要求系统具有以下功能:
A.采编入库:
新购一种书,确定书号后,登记到图书账目表中,若表中已有,则只增加库存量。
B.借阅:
如果一种书的现存量大于零,则借出一本,登记借阅者的书证号和归还期限,改变现存量。
C.归还:
注销对借阅者的登记,改变该书的现存量
2.模块划分
1.采编入库模块
实现功能:
新购一种书,根据书的类别、书名和作者,登记到图书索引表中,如果表中已有,则只增加库存量。
2.借阅书籍模块
实现功能:
如果一本书的存量大于0,则借出一本,登记借阅者的ID号,改变现存量。
3.归还书籍模块
实现功能:
输入借阅者ID号,可查询到所有借阅记录,选择要归还的书,改变该书的现存量。
程序流程图如图3所示。
3.测试数据
采编入库书名为dd,作者为dk的书籍,ID号为10的读者借阅后归还。
四.数据结构
1.书本信息存储结构
(1)存储结构框图
menutable
size
->
size
->
size
->
size
->
size
->
menu
name
->
name
->
name
->
name
->
name
->
书本信息
->
->
书本信息
->
->
读者信息链表
读者信息链表
(2)结构体定义
a.哈希表项
typedefstruct
{
void*p;
intsize;
}hashitem;
b.哈希表
typedefstruct
{
hashitem*h;
intmaxsize;
intnowsize;
}hashtable;
c.索引表项
typedefstruct
{
hashtable*a;
char*name;
}menu;
d.索引表
typedefstruct
{
menu*b;
intsize;
}menutable;
e.书籍结构体
typedefstructbnode
{
char*name;//书名
char*writer;//作者
inttotal;//总量
intnum;//现量
intcode;//书号
structbnode*next;//哈希链
structrnode1*r;//读者链
}book;
f.书本结构体中的读者链
typedefstructrnode1
{
structrnode*r;
structrnode1*next;
}rnode1;
2.读者信息存储结构
menutable
size
->
menu
name
->
name
->
name
->
name
->
name
->
读者信息
->
->
读者信息
->
->
书本信息链表
书本信息链表
a.索引表及哈希表:
结构体同书本
b.读者结构体
typedefstructrnode
{
intcard;//卡号
intnumber;//借书的数量:
借书有默认的最大数量
structrnode*next;//哈希链
structbnode1*b;//书本链
}reader;
c.读者结构体中的书本链
typedefstructbnode1
{
structbnode*b;
structbnode1*next;
}booknode1;
五.算法思想及源程序
1.采编入库模块
图1采编入库程序流程图
实现功能:
新购一种书,根据书的类别、书名和作者,登记到图书索引表中,如果表中已有,则只增加库存量。
程序流程图如图1所示。
(1)主函数部分
case1:
for(i=0;i
{
printf("\t%d.%s\n",i+1,b->b[i].name);
}
printf("\tpleasechoosethenum:
");
scanf("%d",&i);
getchar();
printf("\tpleaseinputthebookname:
");
name=(char*)malloc(sizeof(char)*10);
gets(name);
printf("\tpleaseinputthewriter:
");
writer=(char*)malloc(sizeof(char)*10);
gets(writer);
printf("\n");
add_book(b,i-1,name,writer);
break;
在主菜单输入1,进入添加书籍模式。
提醒用户输入索引表序号,书名,作者。
(2)查找书本
book**find_book(menutable*m,char*name,char*writer,intnum,intj)
{
book**q;
q=(book**)&(m->b[num].a->h[j].p);
if((*q)==NULL)m->b[num].a->nowsize++;
while((*q)!
=NULL&&(strcmp((*q)->name,name)||strcmp((*q)->writer,writer)))
{
q=&((*q)->next);
}
returnq;
}
形参为书籍索引表,待查找书籍的书名、作者、索引表序号和哈希地址,当哈希表的外部链表非空时且链表中书名和作者与待查找书籍不完全相同,执行q=&((*q)->next)向后查找,查找成功则返回指向该书籍的结构体的指针。
若未查找到,则返回NULL。
(3)创建一本新书
book*create_book(char*name,char*writer,inthashsize,intlistsize,intnum)
{
book*a;
a=(book*)malloc(sizeof(book));
a->name=(char*)malloc(sizeof(char)*strlen(name));
a->writer=(char*)malloc(sizeof(char)*strlen(writer));
strcpy(a->name,name);
strcpy(a->writer,writer);
a->total=1;
a->num=1;
a->code=(num+1)*10000+hashsize*100+listsize;//书号规则:
索引+哈希+链表
a->next=NULL;
a->r=NULL;
returna;
}
形参为书名,作者,哈希地址,链表地址,索引地址。
开辟类型为书本结构体的空间。
将书名和作者赋给结构体相应变量,书籍结构体中总量和余量的值附为一。
根据哈希地址,链表地址,索引地址计算书号。
返回值为指向该结构体的指针。
(4)添加书籍函数
voidadd_book(menutable*m,intnum,char*name,char*writer)
{
inti;
intj=0;
for(i=0;i { j+=(int)name[i]+(int)writer[i]; } j=j%(m->b[num].a->maxsize); book**q; q=find_book(m,name,writer,num,j); if((*q)==NULL) { (*q)=create_book(name,writer,j,m->b[num].a->h[j].size,num); m->b[num].a->h[j].size++; } else { (*q)->total++; (*q)->num++; } printf("\tthebookyouaddis: \n"); printf("\tname: %s\n",name); printf("\twriter: %s\n",writer); printf("\ttotal: %d\n",(*q)->total); printf("\tnum: %d\n",(*q)->num); printf("\tcode: %d\n",(*q)->code); } 利用哈希函数(将书名和作者中各位字母的ASCII码相加)确定该书籍的哈希地址。 调用find_book函数查找该书是否存在。 若返回值(*q)==NULL,则说明该书还未加入索引表中,调用*create_book函数,将该种书加入索引表。 若返回值不为NULL,则将该书结构体中总量和余量的值加一。 打印添加的书籍的信息。 3.借阅书籍模块 图2借阅书籍程序流程图 实现功能: 如果一本书的存量大于0,则借出一本,登记借阅者的ID号,改变现存量。 程序流程图如图2所示。 (1)主函数部分 case2: printf("\tpleaseinputyourid: "); scanf("%d",&i); printf("\tpleaseinputbooknumber: "); scanf("%d",&j); printf("\n\n"); borrow_book(b,r,j,i); break; 在主菜单输入2,进入借阅书籍模式。 提示用户输入用户ID号,书号,调用函数borrow_book。 (2)按书号查找书籍 book**find_book1(menutable*m,intcode) { book**q; intnum=code/10000-1; intj=code/100-(num+1)*100; if(num>=m->size||j>=m->b[num].a->maxsize||num<0||j<0) { q=(book**)malloc(sizeof(book*)); (*q)=NULL; returnq; } q=(book**)&(m->b[num].a->h[j].p); while((*q)! =NULL&&(*q)->code! =code) { q=&((*q)->next); } returnq; } 书号规则: 索引表序号*10000+哈希地址*100+链表。 可根据书号求出索引表序号num,哈希地址j。 由索引表序号和哈希地址在h[j]的拉链中查找该书号对应的书,返回值为指向该书籍结构体的指针。 若索引表序号或哈希地址不符合规则或该书不存在,则返回NULL。 (3)查找读者 reader**find_reader(menutable*r,intcard,intj) { reader**q; q=(reader**)&(r->b[0].a->h[j].p); if((*q)==NULL)r->b[0].a->nowsize++; while((*q)! =NULL&&(*q)->card! =card) { q=&((*q)->next); } returnq; } 形参为读者索引表menutable*r,读者ID号和所对应的哈希地址。 在哈希表中查找读者信息,若查找成功,返回值为指向该读者结构体的指针。 若读者ID号不存在,则返回NULL。 (4)创建一个读者 reader*create_reader(intcard) { reader*r; r=(reader*)malloc(sizeof(reader)); r->card=card; r->number=1; r->b=NULL; r->next=NULL; returnr; } 形参为ID号,开辟一片指向reader结构体的指针,根据ID创建一个读者信息结构体。 返回指向该结构体的指针。 (5)借书 intborrow_book(menutable*b,menutable*r,intcode,intcard) { if(code<10000)//编码不符合要求 { printf("\tnosuchbook! \n"); return-1; } book**b1; b1=find_book1(b,code); if((*b1)==NULL) { printf("\tnosuchbook! \n");//不存在此种书籍 return-1; } elseif((*b1)->num==0)//书现存为0 { printf("\tnobookavailable! \n"); return-1; } else(*b1)->num--; //当有书可借时,可以通过ID进行借书,这里如果ID不存在,默认添加进去 intj; j=(card+13)%r->b[0].a->maxsize; reader**q; q=find_reader(r,card,j); //此为添加过程,其中包括了将对应的书本信息保留在读者结点的书本链中 if((*q)==NULL) { (*q)=create_reader(card); r->b[0].a->h[j].size++; (*q)->b=(booknode1*)malloc(sizeof(booknode1)); (*q)->b->b=(*b1); (*q)->b->next=NULL; } else { booknode1*b2=(booknode1*)malloc(sizeof(booknode1)); b2->b=(*b1); b2->next=(*q)->b; (*q)->b=b2; } //此处为将读者信息,添加在书本结点的读者链中 rnode1*r2=(rnode1*)malloc(sizeof(rnode1)); r2->r=(*q); r2->next=(*b1)->r; (*b1)->r=r2; //打印相关信息 printf("\tthebookyouborrowis: \n"); printf("\tname: %s\n",(*b1)->name); printf("\twriter: %s\n",(*b1)->writer); printf("\ttotal: %d\n",(*b1)->total); printf("\tnum: %d\n",(*b1)->num); printf("\tcode: %d\n",(*b1)->code); //printf("\tthereader: %d",(*b1)->r->r->card); return0; } 形参为书籍索引表menutable*b,读者索引表menutable*r,书号,读者ID号。 调用b1=find_book1(b,code)函数,根据书号查找书籍,查找成功则返回值为指向该书籍结构体的指针,将该结构体中书籍余量num减一。 返回值为NULL,则表明书籍不存在。 借阅成功: 书现有NUM-1;借阅不成功: 提示不成功原因 当有书可借时,可以通过ID进行借书,读者的哈希地址由j=(card+13)%r->b[0].a->maxsize计算,即(ID号+13)%哈希表项值。 调用q=find_reader(r,card,j)函数,在哈希表中查找读者信息,若查找成功,返回值为指向该读者结构体的指针。 若该ID号的读者不存在,则返回NULL。 这里如果该ID号的读者不存在,调用create_reader(card)函数,根据ID创建一个读者信息结构体,加入索引表。 将对应的书本信息保留在读者结点的书本链中,并将读者信息添加到书本结点的读者链中。 4.归还书籍模块 图3归还书籍程序流程图 实现功能: 输入借阅者ID号,可查询到所有借阅记录,选择要归还的书,改变该书的现存量。 程序流程图如图3所示。 (1)主函数部分 case3: printf("\tpleaseinputyourid: "); scanf("%d",&i); return_book(r,i); break; 在主菜单输入3,进入归还书籍模式。 提示用户输入ID号。 (2)从书本结构体的读者链表中删除读者 voiddelete_reader(book*b,intcard) { rnode1**r; r=&(b->r); if((*r)->r->card==card) { (*r)=(*r)->next; } else { while((*r)->next->r->card! =card) { r=&((*r)->next); } (*r)->next=(*r)->next->next; } } (3)归还书籍 voidreturn_book(menutable*r,intcard) { intj; inti; j=(card+13)%r->b[0].a->maxsize; reader**q; booknode1**b1; q=find_reader(r,card,j); j=0; if((*q)==NULL) { printf("\tnosuchreader! "); } else {b1=&((*q)->b); while((*b1)! =NULL) { j++; printf("\t%d.%d\n",j,(*b1)->b->code); b1=&((*b1)->next); } do { printf("\tpleasechoosethebooknumber[1-%d]: ",j); scanf("%d",&i); }while(i>j); getchar(); //查询要还的书 b1=&((*q)->b); for(j=2;j { b1=&((*q)->b->next); } //从书本结构体中删除读者 //从读者结构体中删除书本 if(i==1) { delete_reader((*b1)->b,card); (*b1)->b->num++; (*b1)=(*b1)->next; }else { delete_reader((*b1)->next->b,card); (*b1)->next->b->num++; (*b1)->next=(*b1)->next->next; } } printf("\treturnsucceed! \n"); } 可以通过ID号进行还书,读者的哈希地址由ID可计算得到,即(ID号+13)%哈希表项值。 调用find_reader(r,card,j)函数,在哈希表中查找读者信息,若查找成功,返回值为指向该读者结构体的指针。 找到读者信息的书本链,打印该读者所借书籍的书号,提示用户输入归还书籍的编号,从书本结构体中删除读者链,从读者结构体中删除书本。 若读者ID号不存在,则返回NULL,提示未找到读者信息。 五.测试情况 1.主界面 图4主界面 提示用户: 输入1,进入采编入库模式。 输入2,进入借阅模式。 输入3,进入归还书籍模式。 2.添加书籍 图5添加书籍界面 在主菜单输入1,进入添加书籍模式。 提醒用户输入索引表序号,书名,作者。 添加书籍成功后打印添加的书籍信息。 3.借书 图6借书界面 在主菜单输入2,进入借阅书籍模式。 提示用户输入用户输入借阅者ID号,借书的书号。 借阅成功后打印借阅的书籍信息。 4.归还书籍 图7归还书籍界面 在主菜单输入3,进入归还书籍模式。 提示用户输入ID号。 打印出该读者的借阅书籍,提示读者选择归还的书籍,若还书成功,则打印“returnsucceed! ”。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 图书 管理 系统