#include <stdio.h>
#include <malloc.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#define LEN sizeof(struct booklist)
#define LEN2 sizeof(struct memberlist)
#define LEN3 sizeof(struct readers)
typedef struct readers//借書信息結構體
{
char name[30];//借書人的姓名
struct readers *next2;
}reader;
//書本信息結構體
typedef struct booklist
{
char num[20]; //書號
char name[30]; //書名
char concern[50];//出版社
char date[20];//出版日期
char author[20];//作者
int page;//頁數
int price;//價格
int imformation;//圖書剩余數量
reader *a;//借閱人
struct booklist *next;
}Book;
void creatlist();//創建新的書本信息
void print(Book *head);//打印書本信息
void save(Book *head);//儲存書本信息
void AddBook();//添加書本信息
void DelBook();//刪除書本信息
Book *read();//讀取書本信息
void manager();//管理員操作
void Bookconsult(); //圖書查詢
int Borrow();//借書
int Return();//還書
Book *sort(Book *head);//書本信息按書號排序
void imformation();//系統信息
Book *head=NULL,*p1=NULL,*p2=NULL;
//創建新的書本信息
void creatlist()
{
int i,n;
printf("要創建的書本數目");
scanf("%d",&n);
p2=head=(Book *)malloc(LEN); //創建帶有頭結點的鏈表
p2->a=(reader *)malloc(LEN3);
p2->a->next2=NULL;
p2->next=NULL;
printf("請輸入書的信息:\n");
for(i=1;i<=n;i++)
{
p1=(Book *)malloc(LEN);
printf("書號: "); scanf("%s",p1->num);
printf("書名: "); scanf("%s",p1->name);
printf("出版社: "); scanf("%s",p1->concern);
printf("出版日期: "); scanf("%s",p1->date);
printf("作者: "); scanf("%s",p1->author);
printf("書本頁數: "); scanf("%d",&p1->page);
printf("書本價格(元): "); scanf("%d",&p1->price);
p1->a=(reader *)malloc(LEN3);
p1->a->next2=NULL;
p1->imformation=10;
p1->next=NULL;
p2->next=p1;
p2=p1;
if(i<n) printf("下壹本:\n");
}
head=sort(head);
save(head);
print(head);
}
//打印書本信息
void print(Book *head)
{
Book *p=NULL;
reader *p0=NULL;
p=head->next;
printf("*******************************************************************************\n");
while(p!=NULL)
{
printf("書號: %s\n書名: %s\n出版社: %s\n出版日期: %s\n作者: %s\n書本頁數(頁) : %d\n書本價格(元) : %d\n剩余數量 : %d\n",p->num,p->name,p->concern,p->date,p->author,p->page,p->price,p->imformation);
printf("借閱圖書的人:");
if(p->a->next2==NULL) printf("------------暫無借閱人!");
else
{
for(p0=p->a->next2;p0!=NULL;p0=p0->next2)
{
printf("%s ",p0->name);
}
}
p=p->next; /* p後移壹個結點 */
printf("\n");
printf("\n");
}
}
//書本信息按書號排序
Book *sort(Book *head)
{
Book *p1=NULL,*p2=NULL,*p3=NULL,*min=NULL,*min2=NULL,*head2=head->next;
p1=head2;
while(p1->next!=NULL)
{
min=p2=p1; /*把首結點作為最小值*/
while(p2->next!=NULL)
{
if(strcmp(min->num,p2->next->num)>0) /*首結點與下壹結點比較*/
{
min2=p2;
min=p2->next;
}
p2=p2->next;
}
if(min!=p1)
{
min2->next=min->next; /*刪除最小結點*/
min->next=p1; /*插入最小結點*/
if(p1==head2) head2=min;
else p3->next=min; /*p3為min前的結點指針*/
p3=min;
}
else
{
p3=p1;
p1=p1->next;
}
}
head->next=head2;
return(head);
}
//儲存書本信息
void save(Book *head)
{
FILE *fp,*fp2;
Book *p=NULL;
reader *q=NULL;
fp=fopen("書本信息.txt","wb"); //printf("不能打開文件!\n");
fp2=fopen("借閱信息.txt","wb"); //printf("不能打開文件!\n");
p=head;
while(p!=NULL)
{
fwrite(p,LEN,1,fp); /*逐個結點寫文件*/
for(q=p->a;q!=NULL;q=q->next2)
{fwrite(q,LEN3,1,fp2);}
p=p->next;
}
fclose(fp);
fclose(fp2);
}
//添加書本信息
void AddBook()
{
FILE *fp,*fp2;
Book *addbook=NULL;
reader *p0=NULL;
fp=fopen("書本信息.txt","ab"); //追加方式打開文件
fp2=fopen("借閱信息.txt","ab");
addbook=(Book *)malloc(LEN);
printf("輸入書本信息:\n");
printf("書號: "); scanf("%s",addbook->num);
printf("書名: "); scanf("%s",addbook->name);
printf("出版社: "); scanf("%s",addbook->concern);
printf("出版日期: "); scanf("%s",addbook->date);
printf("作者: "); scanf("%s",addbook->author);
printf("書本頁數: "); scanf("%d",&addbook->page);
printf("書本價格(元): "); scanf("%d",&addbook->price);
p0=(reader *)malloc(LEN3);
p0->next2=NULL;
addbook->a=p0;
addbook->imformation=10;
addbook->next=NULL;
fwrite(addbook,LEN,1,fp); /*塊寫*/
fwrite(p0,LEN3,1,fp2);
fclose(fp);
fclose(fp2);
}
//讀取書本信息
Book *read()
{
FILE *fp,*fp2;
Book *p=NULL,*p1=NULL,*head=NULL;
reader *p0=NULL,*p2=NULL;
if((fp=fopen("書本信息.txt","rb"))==NULL) printf("不能打開文件或文件不存在!\n");
if((fp2=fopen("借閱信息.txt","rb"))==NULL) printf("不能打開文件或文件不存在!\n");
head=(Book *)malloc(LEN);
fread(head,LEN,1,fp);
p1=head;
p0=(reader *)malloc(LEN3);
fread(p0,LEN3,1,fp2);
p0->next2=NULL;
head->a=p0;
head->next=NULL;
p=(Book *)malloc(LEN);
while(fread(p,LEN,1,fp)) /*逐個結點讀取*/
{
p1->next=p;
p1=p1->next;
p0=(reader *)malloc(LEN3);
p1->a=p0;
while(fread(p0,LEN3,1,fp2))
{
if(p0->next2==NULL)
{
p2=p0;
p0=(reader *)malloc(LEN3);
break;
}
p2=p0;
p0=(reader *)malloc(LEN3);
p2->next2=p0;
}
free(p0);
p2->next2=NULL;
p=(Book *)malloc(LEN);
}
p1->next=NULL;
free(p);
fclose(fp);
fclose(fp2);
head=sort(head);
if(head!=NULL) return(head);
else
{
printf("文件為空!\n");
return 0;
}
}
//刪除書本信息
void DelBook()
{
Book *head=NULL,*p=NULL,*q=NULL;
char bookname[30];
head=read();
printf("輸入要刪除的書名: ");
scanf("%s",bookname);
p=head;
while(p!=NULL)/*按名字查找要刪除的圖書*/
{
if(strcmp(p->name,bookname)==0)
{
if(p==head)
{
head=head->next;
break;
}
else
{
q->next=p->next;
break;
}
}
q=p;
p=p->next;
}
save(head);
}
//管理員操作
void manager()
{
int n,i=0,k=1;
while(k==1)
{
printf("********************************************************************************\n");
printf(" 請選擇妳需要的操作\n");
printf(" ◎ 1.建立新的書本信息\n");
printf(" ◎ 2.插入書本信息\n");
printf(" ◎ 3.刪除書本信息\n");
printf(" ◎ 4.讀取所有書本信息\n");
printf(" ◎ 5.讀取指定書本信息\n");
printf(" ◎ 6.返回到上級目錄\n");
printf(" ◎ 7.保存並退出\n");
printf("請輸入:");
scanf("%d",&n);
switch(n)
{
case 1: creatlist();break;
case 2: AddBook();break;
case 3: DelBook();break;
case 4: head=read();system("CLS");print(head);break;
case 5: system("CLS");Bookconsult();break;
case 6: k=0;break;
default: k=0;break;
}
}
}
//圖書查詢
void Bookconsult()
{
int n,m=1,sign=0;
Book *p=NULL,*p1=NULL,*p0=NULL,*head=NULL;
reader *p2=NULL;
char a[30],b[20],c[20];
head=read();
while(m==1)
{
printf(" 請選擇妳查詢書本的方式: 1.按書名 2.按書的編號 3.按書的作者 4.退出查詢\n");
printf("輸入=");
scanf("%d",&n);
switch(n)
{
case 1: printf("請輸入書名:");
scanf("%s",a);
p0=head;
while(p0!=NULL)
{
if(strcmp(a,p0->name)==0)
{
printf("*******************************************************************************\n");
printf("書號: %s\n書名: %s\n出版社: %s\n出版日期: %s\n作者: %s\n書本頁數(頁) : %d\n書本價格(元) : %d\n剩余數量 : %d\n",p0->num,p0->name,p0->concern,p0->date,p0->author,p0->page,p0->price,p0->imformation);
printf("借閱圖書的人:");
if(p0->a->next2==NULL) printf("------------暫無借閱人!\n");
else
{
for(p2=p0->a;(p2=p2->next2)!=NULL;)
{printf("%s ",p2->name);}
}
printf("\n");
sign=1;
p0=p0->next;
}
else p0=p0->next;
}
if(sign==0) printf("沒有這本書的信息.\n");
break;
case 2: printf("請輸入書的編號:");
scanf("%s",b);
p0=head;
while(p0!=NULL)
{
if(strcmp(b,p0->num)==0)
{
printf("*******************************************************************************\n");
printf("書號: %s\n書名: %s\n出版社: %s\n出版日期: %s\n作者: %s\n書本頁數(頁) : %d\n書本價格(元) : %d\n剩余數量 : %d\n",p0->num,p0->name,p0->concern,p0->date,p0->author,p0->page,p0->price,p0->imformation);
printf("借閱圖書的人:");
if(p0->a->next2==NULL) printf("------------暫無借閱人!\n");
else
{
for(p2=p0->a;(p2=p2->next2)!=NULL;)
{printf("%s ",p2->name);}
}
printf("\n");
break;
}
else p0=p0->next;
}
if(p0==NULL) printf("沒有這本書的信息.\n");
break;
case 3: printf("請輸入書的作者:");
scanf("%s",c);
p0=head;
while(p0!=NULL)
{
if(strcmp(c,p0->author)==0)
{
printf
("*******************************************************************************\n");
printf("書號: %s\n書名: %s\n出版社: %s\n出版日期: %s\n作者: %s\n書本頁數(頁) : %d\n書本價格(元) %d\n剩余數量 : %d\n",p0->num,p0->name,p0->concern,p0->date,p0->author,p0->page,p0->price,p0->imformation);
printf("借閱圖書的人:");
if(p0->a->next2==NULL) printf("------------暫無借閱人!\n");
else
{
for(p2=p0->a;(p2=p2->next2)!=NULL;)
{printf("%s ",p2->name);}
}
printf("\n");
sign=1;
p0=p0->next;
}
else p0=p0->next;
}
if(sign==0) printf("沒有這本書的信息.\n");
break;
default: m=0;break;
}
}
}
//借書
int Borrow()
{
char a[30],b[30],c;
Book *p0=NULL,*head=NULL;
reader *p2=NULL,*p3=NULL;
head=read();
printf("請輸入要借的書的書號:");
scanf("%s",a);
p0=head->next;
while(p0!=NULL)
{
if((strcmp(a,p0->num))==0)
{
if(p0->imformation>0)
{
printf("圖書在館,可以借出,是否確定借出?'y'or'n'\n");
c=getchar();
scanf("%c",&c);
if(c=='y')
{
printf("請再次輸入妳的用戶名:");
scanf("%s",b);
p3=(reader *)malloc(LEN3);
strcpy(p3->name,b);
if(p0->a->next2==NULL)
{
p0->a->next2=p3;
p3->next2=NULL;
}
else
{
for(p2=p0->a;p2->next2!=NULL;p2=p2->next2);
p2->next2=p3;
p3->next2=NULL;
}
--p0->imformation;
save(head);
printf("操作完成,可以帶走圖書。\n");
return 1;
break;
}
else
{
return 0;
break;
}
}
else printf("很抱歉,該圖書不在館.\n");return 0;break;
}
else p0=p0->next;
}
if(p0==NULL)
{
printf("很抱歉,沒有這本書。\n");
return 0;
}
else return 2;
}
//還書
int Return()
{
Book *p0=NULL,*head=NULL;
reader *p2=NULL,*p3=NULL;
char c[20],b[30];
head=read();
printf("請輸入要還的書的書號:");
scanf("%s",&c);
p0=head->next;
while(p0!=NULL)
{
if((strcmp(c,p0->num))==0)
{
printf("請輸入妳的用戶名:");
scanf("%s",&b);
if(p0->a->next2==NULL) {printf("妳沒有借這本書!\n");break;}
else
{
p3=p0->a;
p2=p3->next2;
while(p2!=NULL)
{
if(strcmp(p2->name,b)==0)
{
if(p2->next2==NULL) {p3->next2=NULL;free(p2);break;}
else
{
p3->next2=p2->next2;
free(p2);
break;
}
}
else
{
p3=p2;
p2=p2->next2;
}
}
if(p2==NULL) printf("妳沒有借這本書!\n");
}
++p0->imformation;
save(head);
printf("書已歸館,操作完成。\n");
return 1;
break;
}
else p0=p0->next;
}
if(p0==NULL)
{
printf("沒有這本書。\n");
return 0;
}
else return 2;
}
//借書信息
void imformation()
{
printf("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n");
printf("※ 歡迎妳使用我們的圖書管理系統!以下是本系統的有關說明: ※\n");
printf("※本系統主要功能是進行圖書的有關管理,妳可以進行圖書信息的創建、插入、刪除、 ※\n");
printf("※查詢;在操作中主要是以阿拉伯數字來選擇相應的菜單功能,在選擇時以'y'表示 '是' ※\n");
printf("※以'n'表示'不是'。在妳操作的時候就會有相應的操作提示。 ※\n");
printf("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n");
}
main()
{
int n,k=1;
printf("********************************************************************************\n");
printf("\n\n");
printf(" 歡迎進入我們的圖書管理系統! \n");
printf("\n\n");
printf("********************************************************************************\n");
while(k==1)
{
printf(" 請選擇妳的操作: 1.管理員操作 2.系統信息 3.退出系統\n");
printf("********************************************************************************\n");
printf(" 妳的選擇是:");
scanf("%d",&n);
system("CLS");
switch(n)
{
case 1: manager();break;
case 2: imformation();break;
default: printf("+++++++++++++++++++++++++++歡迎妳再次使用我們的系統!++++++++++++++++++++++++++++\n");k=0;break;
}
}
}