c语言图书管理系统用链表实现,要有录入,删除,修改,查询,还书,借书,统计,输出
时间: 2023-08-09 09:10:32 浏览: 108
好的,以下是一个简单的基于链表实现图书管理系统的代码,包含录入、删除、修改、查询、还书、借书、统计和输出功能。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 图书结构体
typedef struct Book {
char name[50]; // 书名
char author[50]; // 作者
char press[50]; // 出版社
char publish_date[20]; // 出版日期
int status; // 状态,0表示未借出,1表示已借出
struct Book *next; // 指向下一本书的指针
} Book;
// 全局变量
Book *head = NULL; // 链表头指针
int book_count = 0; // 图书总数
// 函数声明
void add_book(); // 录入图书
void delete_book(); // 删除图书
void modify_book(); // 修改图书信息
void search_book(); // 查询图书
void borrow_book(); // 借阅图书
void return_book(); // 归还图书
void statistics(); // 统计图书信息
void output_books(); // 输出所有图书
int main() {
int choice;
printf("欢迎使用图书管理系统!\n");
while (1) {
printf("\n请选择功能:\n");
printf("1. 录入图书\n");
printf("2. 删除图书\n");
printf("3. 修改图书信息\n");
printf("4. 查询图书\n");
printf("5. 借阅图书\n");
printf("6. 归还图书\n");
printf("7. 统计图书信息\n");
printf("8. 输出所有图书\n");
printf("0. 退出系统\n");
printf("请选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
add_book();
break;
case 2:
delete_book();
break;
case 3:
modify_book();
break;
case 4:
search_book();
break;
case 5:
borrow_book();
break;
case 6:
return_book();
break;
case 7:
statistics();
break;
case 8:
output_books();
break;
case 0:
printf("谢谢使用!\n");
exit(0);
default:
printf("输入无效,请重新输入!\n");
break;
}
}
return 0;
}
// 录入图书
void add_book() {
Book *p = (Book*)malloc(sizeof(Book));
printf("\n请输入图书信息:\n");
printf("书名:");
scanf("%s", p->name);
printf("作者:");
scanf("%s", p->author);
printf("出版社:");
scanf("%s", p->press);
printf("出版日期:");
scanf("%s", p->publish_date);
p->status = 0;
p->next = NULL;
if (head == NULL) {
head = p;
} else {
Book *q = head;
while (q->next != NULL) {
q = q->next;
}
q->next = p;
}
book_count++;
printf("录入成功!\n");
}
// 删除图书
void delete_book() {
char name[50];
printf("\n请输入要删除的图书名称:");
scanf("%s", name);
if (head == NULL) {
printf("链表为空,无法删除!\n");
return;
}
Book *p = head;
if (strcmp(p->name, name) == 0) {
head = p->next;
free(p);
book_count--;
printf("删除成功!\n");
return;
}
while (p->next != NULL) {
if (strcmp(p->next->name, name) == 0) {
Book *q = p->next;
p->next = q->next;
free(q);
book_count--;
printf("删除成功!\n");
return;
}
p = p->next;
}
printf("未找到该图书!\n");
}
// 修改图书信息
void modify_book() {
char name[50];
printf("\n请输入要修改的图书名称:");
scanf("%s", name);
if (head == NULL) {
printf("链表为空,无法修改!\n");
return;
}
Book *p = head;
while (p != NULL) {
if (strcmp(p->name, name) == 0) {
printf("请输入修改后的信息:\n");
printf("书名:");
scanf("%s", p->name);
printf("作者:");
scanf("%s", p->author);
printf("出版社:");
scanf("%s", p->press);
printf("出版日期:");
scanf("%s", p->publish_date);
printf("修改成功!\n");
return;
}
p = p->next;
}
printf("未找到该图书!\n");
}
// 查询图书
void search_book() {
char name[50];
printf("\n请输入要查询的图书名称:");
scanf("%s", name);
if (head == NULL) {
printf("链表为空,无法查询!\n");
return;
}
Book *p = head;
while (p != NULL) {
if (strcmp(p->name, name) == 0) {
printf("书名:%s\n", p->name);
printf("作者:%s\n", p->author);
printf("出版社:%s\n", p->press);
printf("出版日期:%s\n", p->publish_date);
printf("状态:%s\n", p->status == 0 ? "未借出" : "已借出");
return;
}
p = p->next;
}
printf("未找到该图书!\n");
}
// 借阅图书
void borrow_book() {
char name[50];
printf("\n请输入要借阅的图书名称:");
scanf("%s", name);
if (head == NULL) {
printf("链表为空,无法借阅!\n");
return;
}
Book *p = head;
while (p != NULL) {
if (strcmp(p->name, name) == 0) {
if (p->status == 1) {
printf("该图书已被借出,请选择其他图书!\n");
return;
} else {
p->status = 1;
printf("借阅成功!\n");
return;
}
}
p = p->next;
}
printf("未找到该图书!\n");
}
// 归还图书
void return_book() {
char name[50];
printf("\n请输入要归还的图书名称:");
scanf("%s", name);
if (head == NULL) {
printf("链表为空,无法归还!\n");
return;
}
Book *p = head;
while (p != NULL) {
if (strcmp(p->name, name) == 0) {
if (p->status == 0) {
printf("该图书未被借出,无法归还!\n");
return;
} else {
p->status = 0;
printf("归还成功!\n");
return;
}
}
p = p->next;
}
printf("未找到该图书!\n");
}
// 统计图书信息
void statistics() {
int borrowed_count = 0;
int available_count = 0;
Book *p = head;
while (p != NULL) {
if (p->status == 0) {
available_count++;
} else {
borrowed_count++;
}
p = p->next;
}
printf("\n图书总数:%d\n", book_count);
printf("借出图书数:%d\n", borrowed_count);
printf("可借阅图书数:%d\n", available_count);
}
// 输出所有图书
void output_books() {
if (head == NULL) {
printf("链表为空!\n");
return;
}
Book *p = head;
printf("\n所有图书信息如下:\n");
while (p != NULL) {
printf("书名:%s\n", p->name);
printf("作者:%s\n", p->author);
printf("出版社:%s\n", p->press);
printf("出版日期:%s\n", p->publish_date);
printf("状态:%s\n", p->status == 0 ? "未借出" : "已借出");
printf("-------------------------\n");
p = p->next;
}
}
```
注意,上述代码仅为示例,实际应用中可能需要针对具体需求进行修改和完善。同时,还需要注意内存泄漏问题,使用完动态分配的内存后,需要调用 `free()` 函数释放内存。
阅读全文