c语言数据结构课程设计书籍管理系统

# include & ltstdio.h & gt

# 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);打破;

}

}

}