[code]/***************************************************** copyright (C), Nanjing University of Tecnology File name:Book_managmentSystem.c Author: Xiecan Version:0.2 Date: 2016-04-16 11:44 Description: Funcion List: *****************************************************/ #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <string.h> #define M 10 #define N 15 typedef struct book_info { char ISBN ;//書號 char name[M];//書名 char writer[M];//作者 char time[M];//出版日期 char publisher ;//出版社 char price[M];//價格 }Book; typedef struct link { Book info; struct link * next; }Node,*Link; 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); //輸出圖書信息函數原型聲明 /*添加數據子操作*/ void print_info(Link *New,int i); /*刪除子操作*/ 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); /*修改子操作*/ 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); 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 ; 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 ; 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 ; 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 ; 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 ; 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; int a,b; int flag = 0; printf("請輸入你想查找圖書價格的下限:\n"); scanf("%d",&a); printf("請輸入你想查找圖書的上限:\n"); scanf("%d",&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 ; 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 ; 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 ; 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 ; 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,fp); /*頭插法插入節點*/ (*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); }