#include<iostream.h>
#include<string.h>
#include<stdlib.h>
#define MAXSIZE 300 //最大值定义为300
#define LIST_INIT_SIZE 300
typedef struct Boro
{
char BNum[50]; //书号
char RetDate[50]; //归还日期
struct Boro *next;
}Bor;
typedef struct LinkBook
{
Bor *next; //该图书证的借书
char CNum[50]; //卡号
int Total; //借书的数量
}lend[LIST_INIT_SIZE]; //借书人
typedef struct LNode
{
char CardNum[50]; //图书证号
struct LNode *next;
}LinkList; //借书人
typedef struct book
{ char num[10]; //书号
char name[10]; //书名
char auth[10]; //作者
char pub[10]; //出版社
int TotNum; //总库存
int NowNum; //现库存
LinkList *next; //借了该书的人
}ook[MAXSIZE];
int Retotal; //读者数量
int total; //定义外部变量.书的种类数
void InitBo(ook &boo) //初始化图书信息
{
for(int i=0;i<MAXSIZE;i++)
{
boo[i].NowNum=0;
boo[i].TotNum=0;
boo[i].next=NULL;
}
}
void InitRe(lend &Lin) //初始化借阅者信息
{
for(int i=0;i<LIST_INIT_SIZE;i++)
Lin[i].next=NULL;
}
int mid=0; //外部函数mid,用来返回查找到的位置
bool BinarySearch(ook boo,char SearchNum[]) //二分法查找比较书号
{
int low=0,high=total-1;
int found=0;
while(low<=high)
{
mid=(low+high)/2; //中间点
if(strcmp(boo[mid].num,SearchNum)==0) //书号相同
{
found=1;
return true;
} //查找成功
if(strcmp(boo[mid].num,SearchNum)!=0) //书号不同
high=mid-1;
else low=mid+1;
}
if(found==0)
return false; //查找失败
}
void Buy(ook &boo, char BuyNum[])
{
if(BinarySearch(boo,BuyNum)) //如果书库中有此书
{
boo[mid].TotNum++; //总库存加1
boo[mid].NowNum++; //现库存加1
cout<<"入库成功.\n";
cout<<"已更改书库中该书的信息:"<<endl;
cout<<" 编号:"<<boo[mid].num <<" 的书"<<boo[mid].name <<" 作者是"<<boo[mid].auth <<" 出版社是"<<boo[mid].pub<<" 目前的总库存是"<< boo[mid].TotNum <<" 现库存是"<<boo[mid].NowNum <<endl;
}
if(!BinarySearch(boo,BuyNum))
{
int i;
for(i=total;i>mid&&total;i--) //插在适合位置 保持有序
boo[i]=boo[i-1]; //空出插入位置
cout<<"该书在书库中不存在。设立新书目,请补全书的详细信息。\n";
strcpy(boo[i].num,BuyNum);
cout<<"该书新存入的数量是:";
cin>>boo[i].NowNum;
boo[i].TotNum=boo[i].NowNum;
cout<<"该书的名字是:";
cin>>boo[i].name;
cout<<"该书的作者是:";
cin>>boo[i].auth;
cout<<"该书的出版社是:";
cin>>boo[i].pub;//补全信息
boo[i].next=NULL;
total++;//总量+1
cout<<"已增加该书的信息:"<<endl;
cout<<" 编号:"<<boo[i].num << "的书:"<<boo[i].name<<" 作者是:"<<boo[i].auth<<" 出版社是:"<<boo[i].auth<<" 目前的总库存是:"<<boo[i].pub <<endl;
cout<<"入库成功.\n";
}
}
void Delete(ook &boo,char DeleteNum[])
{
if(BinarySearch(boo,DeleteNum)==false||total==0) //如果无此书
cout<<"书库中没有该书.\n";
if(BinarySearch(boo,DeleteNum)) //若有
{
if(!boo[mid].next)
{
int j;
for( j=mid;j<total;j++)
boo[j]=boo[j+1];
strcpy(boo[j].num,boo[j+1].num);
strcpy(boo[j].name,boo[j+1].name);
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].NowNum;
cout<<"已成功删除该书.\n";
}
else cout<<"该书有借阅者,无法删除。\n";
}
}
void Borrow(ook &boo,lend &Lin,char BorrowNum[],char CaNum[])
{
Bor *p,*q;
LinkList *m,*n;
if(!BinarySearch(boo,BorrowNum)||total==0) //如果没有找到此书
cout<<"书库里没这书。\n";//如果有这书
if(BinarySearch(boo,BorrowNum)) //书库里有
{
if(boo[mid].NowNum>0) //看现库存是否大于0
{
boo[mid].NowNum--;//借出一本,少1
if(boo[mid].next==NULL) //若该书信息下显示该种书还没被人借过
{
m=(LinkList *)malloc(sizeof(LNode)); //分配
boo[mid].next=m; //该图书信息中的链表的第一个结点
strcpy(m->CardNum,CaNum);
m->next=NULL; //后一个结点为空
}
else //如果已经有人在借这书了
{
m=boo[mid].next;
while(m->next) //遍历到最后一个结点
m=m->next;
n=(LinkList *)malloc(sizeof(LNode));//分配空间,增加1个结点
m->next=n;
strcpy(n->CardNum,CaNum);//记录证号
n->next=NULL;
}
int i=0;
for(i=0;i<Retotal;i++)//
{
if(!strcmp(Lin[i].CNum,CaNum))//如果已经有该图书证的信息
{
p=Lin[i].next;
while(p->next)p=p->next;//遍历到最后一个结点
q=(Bor *)malloc(sizeof(Boro));//分配空间
p->next=q;
strcpy(q->BNum,BorrowNum); //记录书号
cout<<"输入归还日期:";
cin>>q->RetDate;
q->next=NULL;
cout<<"借阅成功.\n";
break; //找到证了就跳出循环
}
}
if(i==Retotal) //如果没有这张证的信息
{
strcpy(Lin[i].CNum,CaNum); //记录证号
p=(Bor *)malloc(sizeof(Boro)); //分配空间
Lin[i].next=p;
strcpy(p->BNum,BorrowNum);
cout<<"输入归还日期:";
cin>>p->RetDate;
p->next=NULL;
Retotal++; //借阅证号信息总数加1
cout<<"借阅成功.\n";
}
}
else cout<<"借阅失败.该书现在库存为0.\n";
}
}
void Return(ook &boo,lend &Lin,char ReturnNum[],char BorrowerNum[])
{
Bor *p,*q;
LinkList *m,*n;
int flag=0; //设置一个参数
if(!BinarySearch(boo,ReturnNum)||!total) //没书
cout<<"书库中无此书.\n";
if(BinarySearch(boo,ReturnNum)) //有书
{
m=boo[mid].next;
if(!strcmp(m->CardNum,BorrowerNum)) //如果是第一个借的人还的
{
boo[mid].NowNum++; //现库存加1
boo[mid].next=m->next; //删除结点
free(m); //释放该结点的空间空间
}
else
{
while(m->next) //查找归还者的借阅者结点
{
if(!strcmp(m->next->CardNum,BorrowerNum)) //如果找到
{
n=m->next; //n为归还者的借阅结点
m->next=n->next; //m指向归还者的借阅结点的下一结点
free(n); //释放空间
boo[mid].NowNum++; //现库存加1
break;
}
m=m->next;
}
}
}
for(int i=0;i<Retotal;i++)
{
if(!strcmp(Lin[i].CNum,BorrowerNum)) //如果找到借阅者
{
p=Lin[i].next;
if(!strcmp(p->BNum,ReturnNum)) //如果是归还的是借的第一本书
{
Lin[i].next=p->next; //指向下一借书结点
free(p); //释放结点空间
cout<<"成功归还该书.\n";
flag=1;
break;
}
else //找不到
{
while(p->next) //找到归还书的借书结点
{
if(!strcmp(p->next->BNum,ReturnNum)) //如果找到
{
q=p->next; //q为归还书的借书结点
p->next=q->next; //p指向下一借书结点
free(q); //释放空间
cout<<"成功归还该书.\n";
flag=1;
break;
}
p=p->next;
}
}
}
}
for(int k=0;k<Retotal;k++)
if(!Lin[k].next)
{
int j;
for(j=k;j<Retotal;j++)
Lin[j]=Lin[j+1];
strcpy(Lin[j].CNum," "); //删除图书证号
Retotal--; //图书数减1
}
if(flag==0) cout<<"无该证信息.\n";
}
void SearchByNum(ook &boo,char SeaNum[])
{//BY NUM 根据书号查找
LinkList *p;
p=boo[mid].next;
if(BinarySearch(boo,SeaNum)==false)cout<<"对不起,未找到您想查找的书。\n"; //没找到
else//找到了的话
{
{
cout<<" 书号 书名 作者 出版社 现库存 总库存\n";
cout<<" "<<boo[mid].num<<" "<<boo[mid].name<<" "<<boo[m