/* 實現的功能 * @ 1. 錄入圖書的信息 * @ 2. 給定圖書的編號,顯示該圖書的詳細信息 * @ 3. 給定做者的姓名,能夠顯示該做者全部的書 * @ 4. 給定出版社,能夠顯示該出版社出版的圖書 * @ 5. 給定圖書的編號,能夠刪除該圖書的信息 * @ 6. 能夠提供一些統計圖書信息的功能 */ #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct _Book { int book_id; //圖書編號 char book_name[20]; //樹名 char name[20]; //做者姓名 char press[20]; //出版社 struct _Book *next; }book; book *head = NULL; //爲了方便,本人採用全局變量的形式,但不安全,須要改進 int length; //鏈表的長度 //錄入圖書的信息 void create() { book *p1,*p2; length = 0; p1 = (book *)malloc(sizeof(book)); p1->book_id = -1; if(head == NULL) { head = p1; } printf("請輸入需錄入圖書的編號、名字、做者姓名、出版社:\n"); while(1) //當圖書的編號爲0時,表明錄入完成 { p2 = (book *)malloc(sizeof(book)); scanf("%d %s %s %s",&p2->book_id,p2->book_name,p2->name,p2->press); fflush(stdin); //每次清空緩衝區,以便本次輸入對下次輸入形成影響 if(p2->book_id == 0) { printf("圖書信息錄入完成!\n"); break; } length ++; p1->next = p2; p2->next = NULL; p1 = p1->next; } return ; } //顯示圖書信息 void display() { book *p1 = head->next; printf("全部的圖書信息以下:\n"); while(p1 != NULL) { printf("%d %s %s %s %s\n",p1->book_id,p1->book_name,p1->name,p1->press); p1 = p1->next; } return ; } //查找 void search() { int num,x,flag1 = 0,flag2 = 0; char name[20],press[20]; book *p = head->next; printf("一、根據圖書編號進行查找:\n"); printf("二、根據做者姓名進行查找:\n"); printf("三、根據出版社進行查找:\n"); printf("請選擇查找的功能:"); scanf("%d",&x); switch(x) { case 1: { printf("請輸入待查找的圖書編號:"); scanf("%d",&num); while(p != NULL) { if(p->book_id == num) { printf("編號爲%d的圖書信息以下:\n"); printf("%d %s %s %s\n",p->book_id,p->book_name,p->name,p->press); return ; } p = p->next; } if(p == NULL) { printf("該圖書館沒有該圖書的編號!\n"); } } break; case 2: { printf("請輸入待查找的圖書的做者姓名:"); gets(name); while(p != NULL) { if(strcmp(p->name,name) == 0) { flag1++; printf("做者爲%s的圖書信息以下:\n"); printf("%d %s %s%是\n",p->book_id,p->book_name,p->name,p->press); } p = p->next; } if(flag1 == 0) { printf("該圖書館沒有該做者的圖書!\n"); } } case 3: { printf("請輸入待查找圖書的出版社:"); gets(press); while(p != NULL) { if(strcmp(p->press,press) == 0) { flag2++; printf("出版社爲%s的圖書以下:\n"); printf("%d %s %s %s\n",p->book_id,p->book_name,p->name,p->press); } p = p->next; } if(flag2 == 0) { printf("該圖書館沒有該出版社的圖書!\n"); } } default: { printf("選擇有誤!\n"); } break; } return ; } //按編號進行刪除 void Delete() { int num; book *p,*q; q = head; p = head->next; printf("請輸入待刪除的圖書編號:"); scanf("%d",&num); while(p != NULL) { if(p->book_id == num) { q->next = p->next; free(p); length--; printf("刪除成功!\n"); return ; } p = p->next; q = q->next; } if(p == NULL) { printf("該圖書館沒有該編號的圖書!\n"); return ; } } //選擇的菜單 void menu() { printf("-----------------------------------------\n"); printf("|\t\t圖書館管理系統\t\t|\n"); printf("|\t\t0. 退出系統\t\t|\n"); printf("|\t\t1. 錄入圖書信息\t\t|\n"); printf("|\t\t2. 顯示圖書信息\t\t|\n"); printf("|\t\t3. 查詢圖書信息\t\t|\n"); printf("|\t\t4. 刪除圖書信息\t\t|\n"); printf("-----------------------------------------\n"); } int main(void) { int a; menu(); while(1) { printf("請輸入你選擇的功能:"); scanf("%d",&a); switch(a) { case 0: return ; case 1: { create(); menu(); } break; case 2: { if(head != NULL) { display(); menu(); } else { printf("該圖書館沒有錄入圖書,請先錄入!\n"); menu(); } } break; case 3: { if(head != NULL) { search(); menu(); } else { printf("該圖書館沒有錄入圖書,請先錄入!\n"); menu(); } } break; case 4: { if(head != NULL) { Delete(); menu(); } else { printf("該圖書館沒有錄入圖書,請先錄入!\n"); menu(); } } break; default: { printf("選擇有誤!\n"); menu(); } break; } } return 0; }