数据结构图书管理系统方案.docx
《数据结构图书管理系统方案.docx》由会员分享,可在线阅读,更多相关《数据结构图书管理系统方案.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构图书管理系统方案
数据结构
课程设计说明书
学生:
学号:
学院:
专业:
题目:
成绩
指导教师
年月日
1设计目的(小标题黑体五号字)
设计一个计算机管理系统完成图书管理基本业务(数据可以存储在一个数据文件中,数据结构、具体数据自定)。
2.设计容和要求
具体功能有:
1)每种书的登记容包括书号、书名、著作者、出版单位、现存量和库存量;2)对书号建立索引表(线性表)以提高查找效率;3)采编入库:
新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加;4)借阅:
如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和归还期限,改变现存量;5)归还:
注销对借阅者的登记,改变该书的现存量。
3.本设计所采用的数据结构
所用数据结构:
线性表、查找、排序
链表:
用一组地址任意的存储单元存放线性表中的数据元素。
以元素(数据元素的映象)+指针(指示后继元素存储位置)
=结点(表示数据元素或数据元素的映象)
以“结点的序列”表示线性表称作线性链表(单链表)
单链表是一种链式存取的结构,为找第i个数据元素必须先找到第i-1个数据元素。
因此,查找第i个数据元素的基本操作为:
移动指针,比较j和i。
(1)malloc(size)
在存的动态存储区申请一个长度为size字节的连续空间。
(2)calloc(n,size)
在存的动态存储区申请n个长度为size字节的连续空间,函数返回值为分配空间的首地址。
若此函数未被成功执行,函数返回值为0。
(3)free(p)
释放由指针p所指向的存储单元,而存储单元的大小是最近一次调用malloc()或calloc()函数时所申请的存储空间。
运用了单链表的插入、删除、排序、修改等一些操作!
4.功能模块详细设计
4.1详细设计思想
(1)基本思想:
(2)图书信息录入、图书信息的查询、图书信息的排序、图书信息的修改、图书信息的删除、图书的借阅、图书的归还、退出图书管理系统。
(3)程序中的主要函数有:
voidmain()//主函数
intCreateListR(LinkList*L)//尾插法建表
voidLocateElem(LinkList*L)//查询
intSort(LinkList*L)//递增有序排序(直接插入排序法)
voidDisplay(LinkList*L)//输出排序结果
ModifyList(LinkList*L)//修改
intListDelete(LinkList*L)//删除
voidBorrow(LinkList*L)//借阅
voidReturn(LinkList*L)//归还
4.2核心代码
#include
#include
#include
#include
typedefstruct{
intnum;
charname[20];
charauthor[20];
charpress[20];
intcount;
charprice[10];
}ElemType;
typedefstructLNode//定义单链表结点类型
{
ElemTypedata;
structLNode*next;
}LinkList;
voidInitList(LinkList*L)//初始化线性表
{
L=(LinkList*)malloc(sizeof(LinkList));//创建头结点
L->next=NULL;
}
intCreateListR(LinkList*L)//尾插法建表
{
inti,n;
LinkList*s,*q,*p;
p=L;
while(p->next!
=NULL)
p=p->next;
printf("请输入需要录入的图书信息的个数:
n=");
scanf("%d",&n);
for(i=1;is=(LinkList*)malloc(sizeof(LinkList));
printf("书号书名作者名称存馆数量定价\n");
scanf("%d%s%s%s%d%s",&s->data.num,s->data.name,s->data.author,
s->data.press,&s->data.count,s->data.price);
q=L->next;
if(q==NULL){
p->next=s;
p=s;
p->next=NULL;
printf("录入成功!
\n");
continue;
}
while(q!
=NULL){
if(strcmp(s->data.name,q->data.name)==0){
printf("此图书已存在!
");
printf("请重新输入:
\n");
scanf("%d%s%s%s%d%s",&p->data.num,p->data.name,
p->data.author,p->data.press,&p->data.count,
p->data.price);
}
q=q->next;
}
p->next=s;
p=s;
p->next=NULL;
printf("录入成功!
\n");
}
return0;
}
voidLocateElem(LinkList*L)//查询
{
LinkList*p=L->next;//p指向第一个数据结点
intc;
intx=0;
charname1[10],author1[10],press1[10];
printf("1按书名查询:
\n");
printf("2按作者名查询:
\n");
printf("3按名称:
\n");
printf("4返回\n");
printf("请选择1--4进行操作:
\n");
scanf("%d",&c);
if(c>4||c<1){
printf("您的输入有误!
\n");
scanf("%d",&c);
}
switch(c){
case1:
printf("请输入图书书名:
\n");
scanf("%s",name1);
while(p!
=NULL){
if(strcmp(name1,p->data.name)!
=0)//查找图书书名
p=p->next;
else{
printf("书号书名作者名称存馆数量定价\n");
printf("%d\t%s\t%s\t%s\t%d\t%s",p->data.num,p->data.name,
p->data.author,p->data.press,p->data.count,
p->data.price);
printf("\n");
p=p->next;
x++;
}
}
if(p==NULL&&x==0)
printf("对不起,不存在此图书!
\n");
break;
case2:
printf("请输入图书作者:
\n");
scanf("%s",author1);
while(p!
=NULL){
if(strcmp(author1,p->data.author)!
=0)//查找图书作者
p=p->next;
else{
printf("书号书名作者名称存馆数量定价\n");
printf("%d\t%s\t%s\t%s\t%d\t%s",p->data.num,p->data.name,
p->data.author,p->data.press,p->data.count,
p->data.price);
printf("\n");
p=p->next;
x++;
}
}
if(p==NULL&&x==0)
printf("对不起,不存在此图书!
\n");
break;
case3:
printf("请输入图书的名称:
\n");
scanf("%s",press1);
while(p!
=NULL){
if(strcmp(press1,p->data.press)!
=0)//查找图书名称
p=p->next;
else{
printf("书号书名作者名称存馆数量定价\n");
printf("%d%s%s%s%d%s",
p->data.num,p->data.name,p->data.author,
p->data.press,p->data.count,p->data.price);
printf("\n");
p=p->next;
x++;
}
}
if(p==NULL&&x==0)
printf("对不起!
不存在此图书\n");
break;
case4:
break;
}
}
intSort(LinkList*L)//递增有序排序(直接插入排序法)
{
LinkList*p=L->next,*q,*r;//p指向第一个数据结点
if(p!
=NULL)//若原单链表中有一个或以上的数据结点
{
r=p->next;//r保存*p结点直接后继结点的指针
p->next=NULL;//构造只含一个数据结点的有序表
p=r;
while(p!
=NULL){
r=p->next;//r保存*p结点的直接后继结点的指针
q=L;
while(q->next!
=NULL&&q->next->data.numdata.num)
q=q->next;//在有序表中找插入*p的直接前驱结点*q的位置
p->next=q->next;//将*p插入到*q之后
q->next=p;
p=r;//扫描原单链表余下的结点
}
}
return0;
}
voidDisplay(LinkList*L)//输出排序结果
{
LinkList*p=L->next;
while(p!
=NULL){
printf("书号书名作者名称存馆数量