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