c语言数据结构课程设计书籍管理系统
# include & ltstring.h & gt
# include & ltstdlib.h & gt
//
#define MAXSIZE 100 //最大值定义为100。
# define list _ init _ size 100//借书证最大用户数定义为100。
//借款人的结构
Typedef结构Boro//借用行为
{
char BNum[20];//所借图书的书号
char RetDate[8];//返回日期
struct Boro * next
} Bor
typedef结构链接簿
{
Bor * next//这张借书证的借阅行为
char CNum[20];//卡号
int Total//借书数量
} lend[LIST _ INIT _ SIZE];//借用者数组
//书的结构信息
typedef结构LNode
{
char card num[20];//库ID号
struct LNode * next
}链接列表;//借款人
typedef结构书
{//每本书要登记的内容包括ISBN、书名、作者、出版社、总库存和现有库存。
字符编号[20];//图书编号
char name[20];//书名
char auth[20];//作者
char pub[20];//按下
int TotNum//总库存
int NowNum//当前库存
LinkList * next//借书的人
} ook[MAXSIZE];
//
int Retotal//读者数量
int total//定义外部变量。书籍数量
//
//结构初始化
void InitBo(ook & amp;Boo) //初始化图书信息
{
for(int I = 0;我& ltMAXSIZEi++)
{
嘘[我]。NowNum = 0;
嘘[我]。tot num = 0;
嘘[我]。next = NULL
}
}
void InitRe(lend & amp;Lin) //初始化借款人信息
{
for(int I = 0;我& ltLIST _ INIT _ SIZEi++)
林[我]。next = NULL
}
//
int mid = 0;//外部函数mid,用于返回找到的位置。
布尔二分搜索法(OOkboo,Charsearchnum[])//二分法查找比较书号。
{//使用了bool函数,但是由于函数不能有两个返回值,所以设置了一个外部变量mid来返回找到的位置。
int low=0,high = total-1;
int found = 0;
while(low & lt;=高)
{
mid=(低+高)/2;//中间点
If (strcmp (boo [mid])。num,search num)= = 0)//书号相同。
{
发现= 1;
返回true
}//搜索成功。
if(strcmp(boo[mid])。num,SearchNum)!=0)//书号不一样。
高=中1;
else低= mid+1;
}
if(发现==0)
返回false//搜索失败。
}
无效购买(ook & ampboo,char BuyNum[])
{//1.编辑入库:如果购买了新书,如果已经存在于图书账户中,则增加其库存(包括
//包括总库存和当前库存),如果账面不存在,在账面上增加一个账面,总库存和当前库存都是1。
If(BinarySearch(boo,BuyNum)) //如果书库里有这本书。
{
嘘[中]。totnum++;//总库存加1
嘘[中]。nownum++;//当前库存加上1
Printf("接收成功。\ n ");
Printf("图书馆里这本书的信息被改了。编号为%s的图书%s的作者是%s,出版商是% s,当前总库存是%d,当前库存是% d,\n ",boo[mid]。num,boo[mid]。姓名,boo[mid]。auth,boo[mid]。酒馆,boo[mid]。托特纳姆,boo[mid]。NowNum);
}
如果(!BinarySearch(boo,BuyNum))
{
int I;
for(I =总计;我& gt中期和中期。& amp总计;I-)//插在正确的位置,保持有序。
boo[I]= boo[I-1];//空出插入位置
Printf("书库里没有这本书。要建立新的书目,请填写整本书的详细信息。\ n ");
strcpy(boo[i]。num,BuyNum);
Printf("购书数量为:");
scanf(" %d ",& amp嘘[我]。NowNum);
嘘[我]。TotNum=boo[i]。诺姆;
Printf("书的名字是");
scanf(" %s ",& amp嘘[我]。姓名);
Printf("这本书的作者是");
scanf(" %s ",& amp嘘[我]。auth);
Printf("这本书的出版商是");
scanf(" %s ",& amp嘘[我]。pub);//完整信息
嘘[我]。next = NULL
total++;//总金额+1
Printf("本书信息已添加。编号为%s的图书%s的作者是%s,出版商是% s,当前总库存是%d,当前库存是% d,\n ",boo[i]。num,boo[i]。名字,boo[i]。auth,boo[i]。pub,boo[i]。托特纳姆,嘘[我]。NowNum);
Printf("接收成功。\ n ");
}
}
无效删除(ook & ampboo,char DeleteNum[])
{//2.清理存货:某本书没有保留价值,所以从账面上注销。
If(二分搜索法(boo,delete num)= = false | | total = = 0)//如果没有书
Printf("书不在图书馆。\ n ");
If(二分搜索法(boo,删除num))//如果是。
{
如果(!嘘[中]。下一个)
{
int j;
for(j = mid;j & lt总计;j++)
boo[j]= boo[j+1];
strcpy(boo[j].num,boo[j+1]。num);
strcpy(boo[j].姓名,boo[j+1]。姓名);
strcpy(boo[j].auth,boo[j+1]。auth);
strcpy(boo[j].pub,boo[j+1]。pub);
boo[j]。TotNum=boo[j+1]。TotNum
boo[j]。NowNum=boo[j+1]。诺姆;
Printf("该书已成功删除。\ n ");
}
Else printf("本书有借阅者,不能删除。\ n ");
}
}
无效借用(ook & ampboo,lend & amp林,char BorrowNum[],char CaNum[])
{//3.借:如果一本书的现有库存大于零,借出一本书,减少现有库存1。
//并登记借阅者的图书证号和归还期限。
Bor *p,* q;
链表*m,* n;
如果(!二分搜索法(boo,borrownum)| | Total = = 0)//如果没有找到这本书
Printf("这本书不在图书馆。\ n ");//如果你有这本书,
If(二分搜索法(boo,borrownum))//图书馆里有一些。
{
if(boo[mid]。NowNum & gt0) //查看当前库存是否大于0。
{
嘘[中]。NowNum-;//借一本书,1少。
If(boo[mid]。next==NULL) //如果图书信息显示该书未被借阅。
{
m =(LinkList *)malloc(sizeof(LNode));//分布
嘘[中]。next = m;//图书信息中链表的第一个节点。
strcpy(m-& gt;CardNum,CaNum);
m-& gt;next = NULL//最后一个节点为空。
}
Else //如果有人已经在借这本书。
{
m=boo[mid]。接下来;
while(m->;Next) //遍历到最后一个节点
m = m-& gt;接下来;
n =(LinkList *)malloc(sizeof(LNode));//分配空间,添加1个节点。
m-& gt;next = n;
strcpy(n-& gt;CardNum,CaNum);//记录证书编号
n->;next = NULL
}
int I = 0;
for(I = 0;我& ltRetotali++)//
{
如果(!林[i].CNum,CaNum))//如果你已经有了这个借书证的信息,
{
p =林[我]。接下来;
while(p->;下一个)p = p-& gt;接下来;//遍历到最后一个节点
q =(Bor *)malloc(sizeof(Boro));//分配空间
p->;next = q;
strcpy(q-& gt;BNum,BorrowNum);//记录书号
Printf("输入返回日期:");
scanf("%s ",& ampq->;RetDate);
q->;next = NULL
Printf("借款成功。\ n ");
打破;//如果找到证书,跳出循环。
}
}
If(i==Retotal)//如果没有关于此证书的信息,
{
林[1]。CNum,CaNum);//记录证书编号
p =(Bor *)malloc(sizeof(Boro));//分配空间
林[我]。next = p;
strcpy(p-& gt;BNum,BorrowNum);
Printf("输入返回日期:");
scanf(" %s ",& ampp->;RetDate);
p->;next = NULL
retotal++;//图书卡号总信息加1。
Printf("借款成功。\ n ");
}
}
Else printf("借款失败。这本书现在有0英镑的库存。\ n ");
}
}
无效退货(ook & ampboo,lend & ampLin,char ReturnNum[],char BorrowerNum[])
{//4.归还:注销借书人登记,更改图书现有数量。
Bor *p,* q;
链表*m,* n;
int flag = 0;//设置参数
如果(!BinarySearch(boo,ReturnNum)||!合计)//没有书。
Printf("图书馆里没有书。\ n ");
If(二分搜索法(boo,return num))//有书。
{
m=boo[mid]。接下来;
如果(!strcmp(m-& gt;Cardnum,borrowernum)//如果是第一个借书人还的。
{
嘘[中]。nownum++;//当前库存加上1
嘘[中]。next = m-& gt;接下来;//删除节点
免费(m);//释放这个节点的空间。
}
其他
{
while(m->;下一步)//找到返回者的借用者节点。
{
如果(!strcmp(m-& gt;下一个-& gt;CardNum,BorrowerNum)) //如果找到,
{
n = m-& gt;接下来;//n是借款人的借款节点。
m-& gt;next = n-& gt;接下来;//m指向借款人借款节点的下一个节点。
免费(n);//释放空间
嘘[中]。nownum++;//当前库存加上1
打破;
}
m = m-& gt;接下来;
}
}
}
//在借款人表中查找借款人信息。
for(int I = 0;我& ltRetotali++)
{
如果(!林[I].cnum,borrowernum))//如果找到借款人,
{
p =林[我]。接下来;
如果(!strcmp(p-& gt;BNum,return num))///如果还了,就是借的第一本书。
{
林[我]。next = p-& gt;接下来;//指向下一个借用节点
免费(p);//释放节点空间
Printf("书被成功归还。\ n ");
flag = 1;
打破;
}
Else //未找到。
{
while(p->;下一步)//找到还书的借阅节点。
{
如果(!strcmp(p-& gt;下一个-& gt;BNum,ReturnNum)) //如果找到。
{
q = p->;接下来;//q是还书的借阅节点。
p->;next = q-& gt;接下来;//p指向下一个借用节点。
免费(q);//释放空间
Printf("书被成功归还。\ n ");
flag = 1;
打破;
}
p = p-& gt;接下来;
}
}
}
}
for(int k = 0;k & ltRetotalk++)
如果(!林[k]。下一个)
{
int j;
for(j = k;j & ltRetotalj++)
Lin[j]= Lin[j+1];//之后都前进一位,覆盖当前信息。
林[j].CNum,“”;//删除图书卡号
retotal-;//借书证数量减1
}//删除当前状态下未借书的借书证信息,节省空间。
If(flag==0) printf("没有此证书的信息。\ n ");
}
//5.搜索:按三个查询条件之一搜索:按书号搜索,
//按标题和作者搜索。注:组合搜索,即多个条件的组合搜索,可能无法实现。
void search bynum(ook & amp;boo,char SeaNum[])
{//BY NUM按书号搜索。
LinkList * p;
p=boo[mid]。接下来;
If(二分搜索法(boo,seanum) = = false) printf("抱歉,我找不到你要找的书。\ n ");//找不到二分搜索法
Else//如果找到的话。
{
{
printf("┏━━━━━━━┳━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━┳━━━━━┓\n”);
Printf(“书号┃书名┃作者┃出版社┃本期库存┃总库存┃\n”);
printf("┣━━━━━━━╋━━━━━━━╋━━━━━━━━╋━━━━━━━━╋━━━━━╋━━━━━┫\n”);
printf("┃%14s┃%14s┃%16s┃%16s┃%10d┃%10d┃\n",boo[mid].num,boo[mid]。姓名,boo[mid]。auth,boo[mid]。酒馆,boo[mid]。诺姆,嘘[mid]。TotNum);
printf("┗━━━━━━━┻━━━━━━━┻━━━━━━━━┻━━━━━━━━┻━━━━━┻━━━━━┛\n”);
if(boo[mid]。下一个!=空)
{
printf("┏━━━━━━━┓\n”);
Printf(“被借走的书的┃\n”);
Printf("┃图书馆号┃\n”);
while(p)
{
printf("┣━━━━━━━┫\n”);
printf("┃%14s┃\n",p->;card num);
p = p-& gt;接下来;
}
printf("┗━━━━━━━┛\n”);
}
}
while(p)
{
printf(" %s ",p-& gt;card num);//在按书号查找的功能中也显示了借书人的卡号。
p = p-& gt;接下来;
}
printf(" \ n ");
}//显示所搜索书籍的信息。
}
void search by name(ook & amp;boo)
{//按名称按标题搜索。
char SeaName[20];
Printf("输入你要找的书的书名:\ n ");
scanf(" %s ",& ampSeaName);
Printf("找到这个书名的书详情如下:\ n ");
for(int I = 0;我& lt总计;i++)
{
If (strcmp (seaname,boo [i])。name)= = 0)//如果标题相同。
{
Printf("书号:% s \ n标题:% s \ n作者:% s \ n出版商:% s \ n总库存:% d \ n库存:% d \ n \ n ",boo [i]。num,boo [i]。姓名,boo [
}//显示所有符合信息的书籍的信息。
}
}
void search by auth(ook & amp;boo)
{//按作者授权搜索
char sea auth[20];
Printf("输入你想找的书的作者:\ n ");
scanf(" %s ",& ampsea auth);
Printf("查找与作者匹配的书籍详情如下:\ n ");
for(int I = 0;我& lt总计;i++)
{
If (strcmp (seaauth,boo [i])。auth)= = 0)//如果作者相同。
{
Printf("书号:% s \ n标题:% s \ n作者:% s \ n出版商:% s \ n总库存:% d \ n库存:% d \ n \ n ",boo [i]。num,boo [i]。姓名,boo [
}//显示所有符合信息的书籍的信息。
}
}
//6.查看:可以查看借书人用一个借书证号借的所有书,以及所有过期的书。
无效视图卡(ook & ampboo,lend & amp林)
{//查看借书人用一个借书证号借的所有书。
字符编号[20];
Printf("请输入您要查看的图书证号码:\ n ");
scanf(" %s ",& ampnum);
bor * p;
int qqq = 0;
for(int I = 0;我& ltRetotali++)
{
If (strcmp (Lin [I].cnum,num)= = 0)//查找证书。
{
Printf("此证借的书是:\ n ");
p =林[我]。接下来;
while(p)
{
printf(" %s ",p-& gt;BNum);//图书编号
p = p-& gt;接下来;
}
printf(" \ n ");
qqq = 1;
打破;
}
}
如果(qqq==0)
Printf("此证书不存在。\ n ");
}
void view book(ook & amp;boo,lend & amp林)
{//查看所有过期图书。
char date[8];
bor * p;
Printf("请输入日期(请以20060605的格式输入):\ n ");
scanf(" %s ",& amp日期);
Printf("所有逾期图书为:\ n ");
for(int I = 0;我& ltRetotali++)
{
p =林[我]。接下来;
While(p)//当p不为空时
{
if(strcmp(p-& gt;RetDate,date)& lt;0) //过期
{
Printf("书号%s,证书号%s,到期日%s \n ",p-& gt;林[我]。CNum,p-& gt;RetDate);
}//显示所有逾期图书的信息。
p = p-& gt;接下来;
}
}
}
Void Menu() //菜单
{
printf("┏—————————————————m·e·n·u————————————————┓\n”);
printf("││\ n ");
Printf("│ 1。编辑入库:新书购入,如果图书账户中已经有,│\ n”);
Printf("│")会增加自己的库存(包括总库存和当前库存)。│\ n ");
Printf("│如果书不存在,给书账号添加一本书,│\ n ");
Printf("│总库存和现有库存都是输入数字。│\ n ");
Printf("│ 2。清库存:某本书无保留价值,从账面上注销。│\ n ");
Printf("│ 3。借阅:如果一本书的在库库存大于零,则借出一本书,减少在库库存1,│\ n”);
Printf("│")并登记借阅者的图书证号码及归还期限。│\ n ");
Printf("│ 4。归还:注销借书人登记,更改图书现有数量。│\ n ");
Printf("│ 5。按ISBN搜索。│\ n ");
Printf("│ 6。按标题搜索。│\ n ");
Printf("│ 7。按作者搜索。│\ n ");
Printf("│ 8。查一个借书证号的借书人借的所有书。│\ n ");
Printf("│ 9。查看所有过期图书。│\ n ");
Printf("│ 0。退出图书管理系统。│\ n ");
printf("││\ n ");
Printf ("┗————————————┛\n—请选择你需要的运动————————\ n ");
}
void main()
{
ook Bo
借给林;
char BNum[20];
char CNum[20];
Printf (" -欢迎使用图书馆管理系统!-\ n \ n ");
int choice = 10;
int SearchCho=10,view CHO = 10;
而(选择!=0)
{
menu();//显示菜单
scanf(" %d ",& amp选择);
开关(选择)
{
案例1://编辑和入库
Printf("请输入入库图书的书号:");
scanf(" %s ",BNum);
买入(Bo,BNum);
打破;
案例2://清除库存
Printf("请输入您要清除的图书的书号:");
scanf(" %s ",BNum);
删除(Bo,BNum);
打破;
案例三://借款
Printf("请输入你想借的书的书号:\ n ");
scanf(" %s ",& ampBNum);
Printf("请输入库号:");
scanf(" %s ",& ampCNum);
借(Bo,Lin,BNum,CNum);
打破;
案例4:// Return
Printf("请输入您要归还的图书的书号:\ n ");
scanf(" %s ",& ampBNum);
Printf("请输入库号:");
scanf(" %s ",& ampCNum);
Return(Bo,Lin,BNum,CNum);
打破;
案例5://Search//按书号搜索
Printf("请输入ISBN:");//输入要查找的书号。
scanf(" %s ",& ampBNum);
SearchByNum(Bo,BNum);
打破;
案例6://按标题搜索。
search by name(Bo);
打破;
案例7://按作者搜索
SearchByAuth(Bo);
打破;
案例八://查看一个借书证借的所有书。
视卡(博、林);
打破;
案例九://查看所有逾期图书。
ViewBook(博、林);
打破;
情况0://退出系统。
退出(0);打破;
默认:printf("输入错误!\ n ");退出(0);打破;
}
}
}