一、系統介紹
這是一個基于C語言開發的終端圖書管理系統,采用鏈表數據結構?+?二進制文件存儲技術實現。系統具有以下特點:
- ?雙角色系統?:管理員(管理圖書)和讀者(借閱/歸還)
- ?完整功能?:圖書添加、搜索、借閱、歸還、顯示等功能
- ?數據持久化?:所有圖書信息保存在文件中,重啟不丟失
- ?健壯性設計?:完善的輸入驗證和錯誤處理
二、系統完整代碼
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>/* 宏定義 */
#define MAX_NAME 50 // 名稱最大長度
#define MAX_ID 20 // ID最大長度
#if defined(_WIN32)#define CLEAR_SCREEN system("cls") // Windows清屏
#else#define CLEAR_SCREEN system("clear") // Linux/Mac清屏
#endif/* 數據結構 */
// 圖書結構
typedef struct Book {char isbn[MAX_ID]; // ISBN號char title[MAX_NAME]; // 書名char author[MAX_NAME]; // 作者int total_count; // 總數量int available_count; // 可借數量struct Book *next; // 鏈表指針
} Book;// 借閱記錄
typedef struct BorrowRecord {char user_id[MAX_ID]; // 借閱者IDchar book_isbn[MAX_ID]; // 圖書ISBNtime_t borrow_date; // 借書日期(時間戳)time_t return_date; // 還書日期struct BorrowRecord *next; // 鏈表指針
} BorrowRecord;/* 全局變量 */
Book *book_list = NULL; // 圖書鏈表頭指針
BorrowRecord *borrow_list = NULL; // 借閱記錄鏈表頭指針/************************************* 工具函數:清空輸入緩沖區************************************/
void clear_input_buffer() {int c;while ((c = getchar()) != '\n' && c != EOF);
}/************************************* 數據加載:從文件讀取圖書數據************************************/
void load_books() {FILE *fp = fopen("books.dat", "rb");if (fp == NULL) return;Book book_temp;while (fread(&book_temp, sizeof(Book), 1, fp) == 1) {Book *new_book = (Book*)malloc(sizeof(Book));*new_book = book_temp;new_book->next = book_list;book_list = new_book;}fclose(fp);
}/************************************* 數據保存:將當前圖書數據寫入文件************************************/
void save_books() {FILE *fp = fopen("books.dat", "wb");if (fp == NULL) {printf("錯誤:無法保存數據!\n");return;}Book *current = book_list;while (current != NULL) {fwrite(current, sizeof(Book), 1, fp);current = current->next;}fclose(fp);
}/************************************* 功能:添加新書(管理員權限)************************************/
void add_book() {CLEAR_SCREEN;printf("\n======== 添加新書 ========\n");Book *new_book = (Book*)malloc(sizeof(Book));// 輸入ISBN并查重printf("ISBN: ");scanf("%19s", new_book->isbn);clear_input_buffer();Book *current = book_list;while (current != NULL) {if (strcmp(current->isbn, new_book->isbn) == 0) {printf("錯誤:ISBN已存在!\n");free(new_book);return;}current = current->next;}// 輸入其他信息printf("書名: ");fgets(new_book->title, MAX_NAME, stdin);new_book->title[strcspn(new_book->title, "\n")] = '\0'; // 去掉換行符printf("作者: ");fgets(new_book->author, MAX_NAME, stdin);new_book->author[strcspn(new_book->author, "\n")] = '\0';printf("總數量: ");scanf("%d", &new_book->total_count);new_book->available_count = new_book->total_count;clear_input_buffer();// 插入鏈表new_book->next = book_list;book_list = new_book;printf("\n圖書《%s》添加成功!\n", new_book->title);save_books(); // 保存到文件
}/************************************* 功能:按關鍵字搜索圖書(支持模糊搜索)************************************/
void search_book() {CLEAR_SCREEN;printf("\n======== 圖書搜索 ========\n");char keyword[MAX_NAME];printf("輸入ISBN/書名/作者關鍵字: ");fgets(keyword, MAX_NAME, stdin);keyword[strcspn(keyword, "\n")] = '\0'; // 去掉換行符if (strlen(keyword) == 0) {printf("搜索內容不能為空!\n");return;}Book *current = book_list;int found = 0;while (current != NULL) {// 檢查ISBN、書名、作者是否匹配if (strstr(current->isbn, keyword) != NULL || strstr(current->title, keyword) != NULL || strstr(current->author, keyword) != NULL) {printf("\n--------------------");printf("\nISBN: %s\n書名: %s\n作者: %s\n數量: %d/%d\n",current->isbn, current->title, current->author,current->available_count, current->total_count);found = 1;}current = current->next;}if (!found) {printf("未找到匹配的圖書!\n");}
}/************************************* 功能:借閱圖書(讀者權限)************************************/
void borrow_book(char *user_id) {CLEAR_SCREEN;printf("\n======== 借閱圖書 ========\n");char isbn[MAX_ID];printf("輸入要借閱的圖書ISBN: ");scanf("%19s", isbn);clear_input_buffer();// 查找圖書Book *book = book_list;while (book != NULL) {if (strcmp(book->isbn, isbn) == 0) break;book = book->next;}// 檢查圖書狀態if (book == NULL) {printf("錯誤:找不到該圖書!\n");return;} else if (book->available_count <= 0) {printf("錯誤:該書已全部借出!\n");return;}// 創建借閱記錄BorrowRecord *record = (BorrowRecord*)malloc(sizeof(BorrowRecord));strcpy(record->user_id, user_id);strcpy(record->book_isbn, isbn);record->borrow_date = time(NULL); // 當前時間record->return_date = 0; // 0表示未歸還// 更新圖書庫存book->available_count--;// 添加記錄到鏈表record->next = borrow_list;borrow_list = record;printf("\n借閱成功!\n");printf("歸還期限: 30天內\n");printf("借閱時間: %s", ctime(&record->borrow_date));save_books(); // 保存庫存變更
}/************************************* 功能:歸還圖書(讀者權限)************************************/
void return_book(char *user_id) {CLEAR_SCREEN;printf("\n======== 歸還圖書 ========\n");char isbn[MAX_ID];printf("輸入要歸還的圖書ISBN: ");scanf("%19s", isbn);clear_input_buffer();// 查找借閱記錄(未歸還狀態)BorrowRecord *prev = NULL;BorrowRecord *current = borrow_list;int found = 0;while (current != NULL) {if (strcmp(current->user_id, user_id) == 0 && strcmp(current->book_isbn, isbn) == 0 && current->return_date == 0) {found = 1;// 更新圖書庫存Book *book = book_list;while (book != NULL) {if (strcmp(book->isbn, isbn) == 0) {book->available_count++;break;}book = book->next;}// 更新歸還日期current->return_date = time(NULL);printf("\n歸還成功!\n");printf("歸還時間: %s", ctime(¤t->return_date));save_books();return;}prev = current;current = current->next;}if (!found) {printf("錯誤:未找到借閱記錄或已歸還!\n");}
}/************************************* 功能:顯示所有圖書信息************************************/
void display_all_books() {CLEAR_SCREEN;printf("\n======== 所有圖書 ========\n");printf("%-15s %-25s %-20s %-10s\n", "ISBN", "書名", "作者", "庫存(可借/總數)");Book *current = book_list;while (current != NULL) {printf("%-15s %-25s %-20s %d/%d\n", current->isbn, current->title, current->author, current->available_count, current->total_count);current = current->next;}
}/************************************* 管理員菜單************************************/
void admin_menu() {int choice;while (1) {CLEAR_SCREEN;printf("\n======= 管理員菜單 =======\n");printf("1. 添加圖書\n");printf("2. 搜索圖書\n");printf("3. 查看所有圖書\n");printf("0. 退出\n");printf("請選擇操作: ");scanf("%d", &choice);clear_input_buffer();switch (choice) {case 1: add_book(); break;case 2: search_book(); break;case 3: display_all_books(); break;case 0: return;default: printf("無效選擇!\n");}printf("\n按回車鍵繼續...");getchar();}
}/************************************* 讀者菜單************************************/
void reader_menu(char *user_id) {int choice;while (1) {CLEAR_SCREEN;printf("\n======= 讀者菜單 =======\n");printf("讀者ID: %s\n", user_id);printf("1. 借閱圖書\n");printf("2. 歸還圖書\n");printf("3. 搜索圖書\n");printf("4. 查看所有圖書\n");printf("0. 退出\n");printf("請選擇操作: ");scanf("%d", &choice);clear_input_buffer();switch (choice) {case 1: borrow_book(user_id); break;case 2: return_book(user_id); break;case 3: search_book(); break;case 4: display_all_books(); break;case 0: return;default: printf("無效選擇!\n");}printf("\n按回車鍵繼續...");getchar();}
}/************************************* 主函數************************************/
int main() {load_books(); // 啟動時加載圖書數據while (1) {CLEAR_SCREEN;printf("======= 圖書管理系統 =======\n");printf("1. 管理員登錄\n");printf("2. 讀者登錄\n");printf("0. 退出系統\n");printf("請選擇: ");int option;if (scanf("%d", &option) != 1) {clear_input_buffer();continue;}clear_input_buffer();switch (option) {case 1: admin_menu(); break;case 2: {char user_id[MAX_ID];printf("請輸入讀者ID: ");fgets(user_id, MAX_ID, stdin);user_id[strcspn(user_id, "\n")] = '\0';reader_menu(user_id);break;}case 0: {// 程序退出前保存數據save_books();printf("感謝使用,再見!\n");return 0;}default: printf("無效選擇!\n");}}
}
三、系統功能詳解
1. 主要功能模塊
功能模塊 | 描述 | 訪問權限 |
---|---|---|
圖書添加 | 添加新書到系統,包含ISBN、書名、作者等信息 | 管理員 |
圖書搜索 | 通過ISBN、書名或作者關鍵字查找圖書 | 所有用戶 |
借閱管理 | 借閱圖書并自動記錄借閱時間和讀者ID | 讀者 |
歸還管理 | 歸還已借閱圖書并更新庫存 | 讀者 |
圖書顯示 | 以表格形式展示所有圖書信息 | 所有用戶 |
2. 數據結構設計
?
3. 文件存儲機制
系統使用二進制文件books.dat
保存所有圖書數據,采用以下技術:
- ?序列化存儲?:直接將內存中的結構體寫入文件
- ?鏈表遍歷?:通過
fwrite
逐個節點寫入文件 - ?讀取加載?:啟動時重新構建鏈表結構
- ?自動保存?:每次數據變更后自動更新文件
四、使用說明
1. 編譯運行
?Windows系統:?
gcc library.c -o library
library.exe
?Linux/Mac系統:??
gcc library.c -o library
./library
2. 操作流程示例
?管理員操作:??
- 選擇"管理員登錄"
- 添加圖書:
- 搜索圖書:輸入"C程序"
讀者操作:??
- 選擇"讀者登錄",輸入任意ID(如:2023001)
- 借閱圖書:輸入ISBN號
- 查看圖書:選擇"查看所有圖書"
- 歸還圖書:選擇歸還并輸入ISBN號
3. 系統界面示例
======= 圖書管理系統 =======
1. 管理員登錄
2. 讀者登錄
0. 退出系統
請選擇: 1======= 管理員菜單 =======
1. 添加圖書
2. 搜索圖書
3. 查看所有圖書
0. 退出
請選擇操作: 1======== 添加新書 ========
ISBN: 1234567890
書名: C程序設計語言
作者: XXXX
總數量: 10圖書《C程序設計語言》添加成功!
五、擴展與優化建議
1. 可擴展功能
- ?借閱記錄持久化?:添加
borrow.dat
保存借閱記錄 - ?逾期計算?:根據借閱時間自動計算逾期費用
- ?管理員密碼?:增加管理員登錄驗證
- ?批量導入?:支持從CSV文件批量導入圖書
2. 性能優化
// 示例:優化查找函數(哈希表實現)
#define HASH_SIZE 100typedef struct HashTable {Book *table[HASH_SIZE];
} HashTable;// ISBN哈希函數
unsigned int hash_function(char *isbn) {unsigned int hash = 0;for (int i = 0; i < strlen(isbn); i++) {hash = 31 * hash + isbn[i];}return hash % HASH_SIZE;
}// 添加圖書到哈希表
void add_to_hash(Book *book, HashTable *hash_table) {unsigned int index = hash_function(book->isbn);book->next = hash_table->table[index];hash_table->table[index] = book;
}
3. 增強安全性
- ?輸入驗證?:添加更嚴格的ISBN格式檢查
- ?密碼加密?:管理員密碼使用MD5/SHA加密存儲
- ?訪問控制?:不同讀者只能查看自己的借閱記錄
六、總結
這個C語言圖書管理系統具有完整的功能實現、清晰的代碼結構和良好的擴展性,適合用作課程設計或學習項目。系統特點包括:
- 采用鏈表數據結構動態管理數據
- 文件存儲實現數據持久化
- 模塊化設計便于功能擴展
- 完整的輸入驗證和錯誤處理
- 跨平臺兼容性(Windows/Linux/Mac)
將整個代碼復制到library.c
文件中即可編譯運行,無需任何外部依賴庫。
?資源推薦:
C/C++學習交流君羊
C/C++教程
C/C++學習路線,就業咨詢,技術提升