// 圖書節點
typedef struct Book {
char isbn[20], title[100], author[50], publisher[50];
int total, available; // 總量、可借量
struct Book *prev, *next;
} Book;
// 會員節點
typedef struct Member {
char id[20], name[50], phone[20];
int borrowed_count;
struct Member *prev, *next;
} Member;
// 借閱記錄
typedef struct Record {
char book_isbn[20], member_id[20];
time_t borrow_date, due_date, return_date; // 0=未歸還
struct Record *next;
} Record;
// 系統上下文
typedef struct {
Book *book_head, *book_tail;
Member *mem_head, *mem_tail;
Record *rec_head;
} LibrarySys;
// 初始化/銷毀
void sys_init(LibrarySys *sys);
void sys_destroy(LibrarySys *sys);
// 文件持久化
void sys_load(LibrarySys *sys, const char *dir);
void sys_save(LibrarySys *sys, const char *dir);
// 圖書操作
Book* book_add(LibrarySys *sys, const Book *b);
Book* book_find_by_isbn(LibrarySys *sys, const char *isbn);
void book_remove(LibrarySys *sys, const char *isbn);
void book_list(LibrarySys *sys);
// 會員操作
Member* mem_add(LibrarySys *sys, const Member *m);
Member* mem_find_by_id(LibrarySys *sys, const char *id);
void mem_remove(LibrarySys *sys, const char *id);
void mem_list(LibrarySys *sys);
// 借還書
int borrow_book(LibrarySys *sys, const char *isbn, const char *mid);
int return_book(LibrarySys *sys, const char *isbn, const char *mid);
void list_borrowed(LibrarySys *sys, const char *mid);
int borrow_book(LibrarySys *sys, const char *isbn, const char *mid) {
Book *b = book_find_by_isbn(sys, isbn);
Member *m = mem_find_by_id(sys, mid);
if (!b || !m) return -1; // 不存在
if (b->available <= 0) return -2; // 無庫存
if (m->borrowed_count >= 5) return -3; // 限借 5 本
Record *r = malloc(sizeof(Record));
strcpy(r->book_isbn, isbn);
strcpy(r->member_id, mid);
r->borrow_date = time(NULL);
r->due_date = r->borrow_date + 30*24*3600; // 30 天
r->return_date = 0;
r->next = sys->rec_head;
sys->rec_head = r;
b->available--;
m->borrowed_count++;
return 0;
}
int main() {
LibrarySys sys;
sys_init(&sys);
sys_load(&sys, "data");
int choice;
while (1) {
printf("\n1.圖書管理 2.會員管理 3.借書 4.還書 5.查詢借閱 0.退出\n選擇: ");
scanf("%d", &choice);
switch(choice) {
case 1: book_menu(&sys); break;
case 2: member_menu(&sys); break;
case 3: { char isbn[20], mid[20]; scanf("%s%s", isbn, mid); borrow_book(&sys, isbn, mid); } break;
case 4: { char isbn[20], mid[20]; scanf("%s%s", isbn, mid); return_book(&sys, isbn, mid); } break;
case 5: { char mid[20]; scanf("%s", mid); list_borrowed(&sys, mid); } break;
case 0: sys_save(&sys, "data"); sys_destroy(&sys); return 0;
}
}
}
完整可編譯代碼(含文件讀寫、輸入驗證、錯誤處理)約 400 行,可參考百度文庫資源:C語言圖書管理系統源碼,或自行按上述架構實現。