圖書管理系統

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>函數

#define M 10
#define N 15指針

typedef struct book_info
{
char ISBN[N];//書號
char name[M];//書名
char writer[M];//做者
char time[M];//出版日期
char publisher[N];//出版社
char price[M];//價格
}Book;原型

typedef struct link
{
Book info;
struct link * next;string

}Node,*Link;it

void Add_book(Link *Head,Link *New);//添加圖書信息函數原型聲明
void Delete_book(Link *Head); //刪除圖書信息函數原型聲明
void Find_book(Link *Head); //查找圖書信息函數原型聲明
void Update_book(Link *Head); //修改圖書信息函數原型聲明
void Print_book(Link *Head); //輸出圖書信息函數原型聲明io

/*添加數據子操做*/
void print_info(Link *New,int i);date

/*刪除子操做*/
void delete_ISBN(Link *Head);
void delete_name(Link *Head);
void delete_writer(Link *Head);
void delete_publisher(Link *Head);書籍

/*查找子操做*/
void search_ISBN(Link *Head);
void search_name(Link *Head);
void search_writer(Link *Head);
void search_publisher(Link *Head);
void search_price(Link *Head);
void search_time(Link *Head);gc

/*修改子操做*/
void update_ISBN(Link *p);
Link update_name(Link p);
Link update_writer(Link p);
Link update_publisher(Link p);
Link update_price(Link p);
Link update_time(Link p);im

void choose_op(Link *Head);

/*輸出一本圖書的信息*/
void print(Link *Head);

/*圖書管理系統菜單*/
void Menus(Link *Head,Link *New);

int main(int argc, char **argv)
{
FILE * fp;
int bytes_read,bytes_write;

Link Head = NULL,p; //節點聲明
Link New = NULL;
int c = 1;
p = Head;

Head = (Link)malloc(sizeof(Node));//創建頭節點
Head->next = NULL; //空鏈表


while(c)
{
Menus(&Head,&New);

printf("你想繼續操做嗎?\
\n1.繼續\
\n2.退出\n");
scanf("%d",&c);

}
return 0;
}

/****************************************************
函數功能:選擇菜單
****************************************************/
void Menus(Link *Head,Link *New)
{
int ch;
printf("/***************歡迎進入圖書管理系統****************/\n");
printf("1.添加圖書信息\
\n2.刪除圖書信息\
\n3.查找圖書信息\
\n4.修改圖書信息\
\n5.輸出圖書管理系統全部圖書信息\
\n6.退出系統\
\n/***************************************************/\n");
scanf("%d",&ch);
switch(ch)
{
case 1:
Add_book(Head,New);
Print_book(Head);
break;
case 2:
Delete_book(Head);
Print_book(Head);
break;
case 3:
Find_book(Head);
break;
case 4:
Update_book(Head);
break;
case 5:
Print_book(Head);
break;
case 6:
exit(0);
default:
printf("輸入錯誤,請從新輸入!\n");

}
}
/****************************************************
函數功能:修改指定圖書的ISBN
****************************************************/
void update_ISBN(Link *p)
{
printf("請輸入新的ISBN:\n");
scanf("%s",(*p)->info.ISBN);

}
/****************************************************
函數功能:修改指定圖書的書名
****************************************************/
Link update_name(Link p)
{
printf("請輸入新的書名:\n");
scanf("%s",p->info.name);
return p;
}
/****************************************************
函數功能:修改指定圖書的做者
****************************************************/
Link update_writer(Link p)
{
printf("請輸入新的做者名字:\n");
scanf("%s",p->info.writer);
return p;
}

/****************************************************
函數功能:修改指定圖書的出版社名字
****************************************************/
Link update_publisher(Link p)
{
printf("請輸入新的出版社名字:\n");
scanf("%s",p->info.publisher);
return p;
}

/****************************************************
函數功能:修改指定圖書的價格
****************************************************/
Link update_price(Link p)
{
printf("請輸入新的價格:\n");
scanf("%d",p->info.price);
return p;
}

/****************************************************
函數功能:修改指定圖書的出版日期
****************************************************/
Link update_time(Link p)
{
printf("請輸入新的出版日期:\n");
scanf("%s",p->info.time);
return p;
}


/*****************************************************
函數功能:修改指定圖書的信息
*****************************************************/
void Update_book(Link *Head)
{
char str[N];
int flag = 0;
Link p;
/*輸出錄入圖書的信息*/
Link q;


printf("請輸入你要修改圖書的ISBN:\n");//根據ISBN找到指定圖書
scanf("%s",str);

p = *Head;

if(p->next == NULL)//鏈表爲空
{
printf("沒有圖書,不能進行修改操做.\n");
}

while(p->next != NULL)
{
if(strcmp(p->next->info.ISBN,str) == 0)//若是p->next->info.ISBN與指定的ISBN號相同,則輸出對應的圖書信息
{
flag = 1;
printf("\n/------------你想要修改圖書的全部信息爲----------------/\n");

/*調用函數顯示指定圖書的全部信息*/
q = p->next;
print(&q);

/*調用函數選擇修改操做*/
choose_op(&q);

break;
}
p = p->next;
}
if(!flag)
{
printf("不能進行修改操做,沒有ISBN爲%s的書\n",str);
}

}

/******************************************************
函數功能:根據須要選擇要進行修改的操做
******************************************************/
void choose_op(Link *p)
{
int ch;
Link q;
q = *p;
int c = 1;

while(c)
{
c = 0;
printf("請選擇你想進行的修改操做:\n");
printf("1.修改ISBN\
\n2.修改書名\
\n3.修改做者\
\n4.修改出版社名\
\n5.修改書的價格\
\n6.修改出版日期\n");
scanf("%d",&ch);

switch(ch)
{
case 1:
update_ISBN(&q);
print(&q);
break;
case 2:
update_name(q);
break;
case 3:
update_writer(q);
break;
case 4:
update_publisher(q);
break;
case 5:
update_price(q);
break;
case 6:
update_time(q);
break;
default:
printf("輸入錯誤\n");
}
C: printf("還要繼續修改嗎?\
\n1.繼續\
\n0.退出\n");
scanf("%d",&c);
if(c > 1)
{
printf("輸入錯誤,請從新輸入!\n");
goto C;
}

}
printf("修改後:\n");
print(p);
}

/*****************************************************
函數功能:查找指定圖書的信息
****************************************************/
void Find_book(Link *Head)
{
int ch;

printf("請選擇你想進行的查找操做:\n");
printf("1.按ISBN查找\
\n2.按書名查找\
\n3.查找指定做者的全部書\
\n4.查找指定出版社出版的全部書\
\n5.查找書的價格範圍在指定區間的書\
\n6.查找出版時間在指定區間內的書\n");
scanf("%d",&ch);

switch(ch)
{
case 1:
search_ISBN(Head);
break;
case 2:
search_name(Head);
break;
case 3:
search_writer(Head);
break;
case 4:
search_publisher(Head);
break;
case 5:
search_price(Head);
break;
case 6:
search_time(Head);
break;
default:
printf("輸入錯誤\n");
}

}
/*****************************************************
函數功能:根據ISBN查找圖書信息
*****************************************************/
void search_ISBN(Link *Head)
{
Link p;
char str[N];
int flag = 0;

printf("請輸入你想查找圖書的ISBN:\n");
scanf("%s",&str);

p = (*Head)->next;

if(p == NULL)//鏈表爲空
{
printf("沒有圖書,不能進行查找操做.\n");
}

while(p != NULL)
{
if(strcmp(p->info.ISBN,str) == 0)//若是p->next->info.ISBN與指定的ISBN號相同,則輸出對應的圖書信息
{
flag = 1;
printf("\n/------------你查找的圖書信息爲----------------/\n");
print(&p);
break;
}
p = p->next;
}
if(!flag)
{
printf("沒有ISBN爲%s的書\n",str);
}

}
/*****************************************************
函數功能:根據書名查找信息
*****************************************************/
void search_name(Link *Head)
{
Link p;
char str[N];
int flag = 0;

printf("請輸入你想查找圖書的書名:\n");
scanf("%s",&str);

p = (*Head)->next;

if(p == NULL)//鏈表爲空
{
printf("沒有圖書,不能進行查找操做.\n");
}

while(p != NULL)
{
if(strcmp(p->info.name,str) == 0)//若是p->next->info.name與指定的書名相同,則輸出對應的圖書信息
{
flag = 1;
printf("\n/------------你查找的圖書信息爲----------------/\n");
print(&p);
break;
}
p = p->next;
}
if(!flag)
{
printf("沒有書名爲%s的書\n",str);
}
}
/*****************************************************
函數功能:查找指定圖書做者寫的圖書信息
*****************************************************/
void search_writer(Link *Head)
{
Link p;
char str[N];
int flag = 0;

printf("請輸入你想查找圖書的做者:\n");
scanf("%s",&str);

p = (*Head)->next;

if(p == NULL)//鏈表爲空
{
printf("沒有圖書,不能進行查找操做.\n");
}

while(p != NULL)
{
if(strcmp(p->info.writer,str) == 0)//若是p->next->info.writer與指定的做者相同,則輸出對應的圖書信息
{
flag = 1;
printf("\n/------------你查找的圖書信息爲----------------/\n");
print(&p);
break;
}
p = p->next;
}
if(!flag)
{
printf("沒有做者%s的書\n",str);
}
}
/*****************************************************
函數功能:查找指定出版社出版的圖書信息
*****************************************************/
void search_publisher(Link *Head)
{
Link p;
char str[N];
int flag = 0;

printf("請輸入你想查找圖書的出版社名字:\n");
scanf("%s",&str);

p = (*Head)->next;

if(p == NULL)//鏈表爲空
{
printf("沒有圖書,不能進行查找操做.\n");
}

while(p != NULL)
{
if(strcmp(p->info.publisher,str) == 0)//若是p->next->info.publisher與指定的出版社名字相同,則輸出對應的圖書信息
{
flag = 1;
printf("\n/------------你查找的圖書信息爲----------------/\n");
print(&p);
break;
}
p = p->next;
}
if(!flag)
{
printf("沒有出版社%s的書\n",str);
}
}
/*****************************************************
函數功能:查找圖書價格在指定區間上的書
*****************************************************/
void search_price(Link *Head)
{
Link p;
char a[M],b[M];
int flag = 0;

printf("請輸入你想查找圖書價格的下限:\n");
scanf("%s",a);
printf("請輸入你想查找圖書的上限:\n");
scanf("%s",b);

p = (*Head);//->next;

if(p == NULL)//鏈表爲空
{
printf("沒有圖書,不能進行查找操做.\n");
}

while(p != NULL)
{
if((p->info.price>a) && (p->info.price<b))//若是p->next->info.price在指定的區間[a,b]內,則輸出對應的圖書信息
{
flag = 1;
printf("\n/------------價格位於[%d,%d]內圖書信息爲----------------/\n",a,b);
print(&p);
break;
}
p = p->next;
}
if(!flag)
{
printf("沒有圖書價格位於[%d,%d]內的書\n",a,b);
}
}
/*****************************************************
函數功能:查找出版日期在區間[a,b]中的圖書
*****************************************************/
void search_time(Link *Head)
{
Link p;
char a[M],b[M];
int flag = 0;

printf("請輸入你想查找圖書出版日期的區間[a,b]:(以逗號隔開)\n");
scanf("%s,%s",a,b);

p = (*Head);

if(p == NULL)//鏈表爲空
{
printf("沒有圖書,不能進行查找操做.\n");
}

while(p != NULL)
{
if((p->info.time >= a) && (p->info.time <= b))//若是p->next->info.time在指定的區間[a,b]內,則輸出對應的圖書信息
{
flag = 1;
printf("\n/------------出版日期位於[%s,%s]內圖書信息爲----------------/\n",a,b);
print(&p);
break;
}
p = p->next;
}
if(!flag)
{
printf("沒有出版日期位於[%s,%s]內的書\n",a,b);
}
}
/*****************************************************
函數功能:刪除圖書
*****************************************************/
void Delete_book(Link *Head)
{
Link p;
int ch;

printf("請選擇你想進行的刪除操做:\n");
printf("1.刪除與指定ISBN相同的書\
\n2.刪除與指定書名相同的書\
\n3.刪除指定做者的書\
\n4.刪除指定出版社的書\n");
scanf("%d",&ch);

switch(ch)
{
case 1:
delete_ISBN(Head);
break;
case 2:
delete_name(Head);
break;
case 3:
delete_writer(Head);
break;
case 4:
delete_publisher(Head);
break;
default:
printf("輸入錯誤!\n");
}
}
/*****************************************************
函數功能:刪除與指定ISBN相同的書
*****************************************************/
void delete_ISBN(Link *Head)
{
Link p,q;
char str[N];
int flag = 0;
printf("請輸入你想刪除圖書的ISBN:\n");
scanf("%s",&str);

p = *Head;

if(p->next == NULL)//鏈表爲空
{
printf("沒有圖書,不能進行刪除操做.\n");
}

while(p->next != NULL)
{
if(strcmp(p->next->info.ISBN,str) == 0)//若是p->next->info.ISBN與指定的ISBN號相同,則刪除此圖書節點
{
flag = 1;
q = p->next;
p->next = q->next;
free(q);
break;
}
p = p->next;
}
if(!flag)
{
printf("沒有ISBN爲%s的書\n",str);
}


}
/*****************************************************
函數功能:刪除與指定書名相同的書
*****************************************************/
void delete_name(Link *Head)
{
Link p,q;
char str[N];
int flag = 0;
printf("請輸入你想刪除圖書的名字:\n");
scanf("%s",&str);

p = *Head;

if(p->next == NULL)//鏈表爲空
{
printf("沒有圖書,不能進行刪除操做.\n");
}

while(p->next != NULL)
{
if(strcmp(p->next->info.name,str) == 0)//若是p->next->info.ISBN與指定的書名相同,則刪除此圖書節點
{
q = p->next;
p->next = q->next;
free(q);
flag = 1;
break;
}
p = p->next;
}
if(!flag)
{
printf("沒有這本書\n");
}

}
/*****************************************************
函數功能:刪除指定做者的書
*****************************************************/
void delete_writer(Link *Head)
{
Link p,q;
char str[N];
int flag = 0;
printf("請輸入你想刪除圖書的做者名:\n");
scanf("%s",&str);

p = *Head;

if(p->next == NULL)//鏈表爲空
{
printf("沒有圖書,不能進行刪除操做.\n");
}

while(p->next != NULL)
{
if(strcmp(p->next->info.writer,str) == 0)//若是p->next->info.ISBN與指定的做者名相同,則刪除此圖書節點
{
q = p->next;
p->next = q->next;
free(q);
flag = 1;
break;
}
p = p->next;
}
if(!flag)
{
printf("沒有做者%s的書\n",str);
}

}
/*****************************************************
函數功能:刪除指定出版社的書
*****************************************************/
void delete_publisher(Link *Head)
{
Link p,q;
char str[N];
int flag = 0;
printf("請輸入你想刪除圖書的出版社名字:\n");
scanf("%s",&str);

p = *Head;

if(p->next == NULL)//鏈表爲空
{
printf("沒有圖書,不能進行刪除操做.\n");
}

while(p->next != NULL)
{
if(strcmp(p->next->info.publisher,str) == 0)//若是p->next->info.ISBN與指定的出版社名字相同,則刪除此圖書節點
{
q = p->next;
p->next = q->next;
free(q);
flag = 1;
break;
}
p = p->next;
}
if(!flag)
{
printf("沒有%s出版社的書\n",str);
}
}

/*****************************************************
函數功能:錄入新的書籍信息
****************************************************/
void Add_book(Link *Head,Link *New)
{
int i;
int num;
Link p;
FILE * fp;

if((fp = fopen("F:\\book_info.txt","a+")) == NULL)
{
perror("書庫文件打開失敗,不能錄入信息!\n");
exit(1);
}

p = (*Head)->next;

printf("你想錄入幾本書?\n");
scanf("%d",&num);

for(i = 0; i < num; i++)
{
*New = (Link)malloc(sizeof(Node));
/*輸入圖書的信息*/
print_info(New,i);

/*頭插法插入節點*/
(*New)->next = (*Head)->next;
(*Head)->next = *New;
}
}

/*******************************************************
函數功能:輸入圖書的信息
*******************************************************/
void print_info(Link *New,int i,FILE *fp)
{
printf("請輸入第%d本書的信息:\n",i+1);

printf("ISBN:");
scanf("%s",&(*New)->info.ISBN);
fwrite((*New)->info.ISBN,N,1,fp);

printf("書名:");
scanf("%s",&(*New)->info.name);
fwrite((*New)->info.name,M,1,fp);

printf("做者:");
scanf("%s",&(*New)->info.writer);
fwrite((*New)->info.writer,M,1,fp);

printf("出版社:");
scanf("%s",&(*New)->info.publisher);
fwrite((*New)->info.ISBN,N,1,fp);

printf("出版時間:");
scanf("%s",&(*New)->info.time);
fwrite((*New)->info.ISBN,N,1,fp);

printf("價格:");
scanf("%5f",&(*New)->info.price);
fwrite((*New)->info.ISBN,N,1,fp);
}

/********************************************************
函數功能:輸出圖書信息
*******************************************************/
void Print_book(Link *Head)
{
int i = 0;
Link p;
p = *Head;

printf("/*******************************************\
\n管理系統全部的圖書爲:\n");
if(p->next == NULL)
{
printf("沒有圖書!\n");
}
while(p->next != NULL)
{
i++;
print(&p->next);//調用函數輸出指針p所指向的圖書的信息
p = p->next;
}
}

/**************************************************
函數功能:輸出一本圖書的信息
*************************************************/
void print(Link *L)
{
Link p;
p = *L;

printf("ISBN:%s\n",p->info.ISBN);
printf("書名:%s\n",p->info.name);
printf("做者:%s\n",p->info.writer);
printf("出版社:%s\n",p->info.publisher);
printf("出版時間:%s\n",p->info.time);
printf("價格:%f\n",p->info.price);

}

相關文章
相關標籤/搜索