采用链表数据结构实现一“图书管理系统〞,为用户提供管理和查询服务。 图书信息包括8个数据项:书名,ISBN、作者、出版社、出版时间,入库时间, 库存量(图书馆购买此书的数量),借阅数(被借阅的数量)等信息。完成以下 操作: (1)录入:图书信息(至少10条记录): (2)删除:删除某一本图书的信息; (3)修改:修改某一本图书的信息: (4)查询:根据书名或图书ISBV等查询图书信息(查询方法不限)。 (5)借书:借出一本书,该书的借阅数增加一本。 (6)还书:还回一本书,该书的借阅数减少一本。 (7)统计:统计所有借出的图书数目,即所有图书借阅数之和。 (8)输出:输出所查询图书的信息,要求格式清晰,方便查看。
时间: 2023-11-28 22:47:57 浏览: 74
以下是用链表数据结构实现的图书管理系统的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
//定义图书信息结构体
typedef struct BookInfo {
char name[100];
char ISBN[20];
char author[50];
char press[50];
char publishTime[20];
char storeTime[20];
int stock;
int borrow;
struct BookInfo *next;
} book;
//定义全局变量,头结点指针
book *head = NULL;
//函数声明
void addBook(); //录入
void deleteBook(); //删除
void modifyBook(); //修改
void searchBook(); //查询
void borrowBook(); //借书
void returnBook(); //还书
void countBook(); //统计
void printBook(book *b); //输出
int main() {
int choice;
while (1) {
printf("请选择操作:\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:
addBook();
break;
case 2:
deleteBook();
break;
case 3:
modifyBook();
break;
case 4:
searchBook();
break;
case 5:
borrowBook();
break;
case 6:
returnBook();
break;
case 7:
countBook();
break;
case 8:
printBook(head);
break;
case 0:
exit(0);
default:
printf("输入有误,请重新输入!\n");
}
}
return 0;
}
//录入图书
void addBook() {
book *b = (book *) malloc(sizeof(book)); //动态分配内存
if (b == NULL) {
printf("内存分配失败!\n");
return;
}
printf("请输入书名:");
scanf("%s", b->name);
printf("请输入ISBN号:");
scanf("%s", b->ISBN);
printf("请输入作者:");
scanf("%s", b->author);
printf("请输入出版社:");
scanf("%s", b->press);
printf("请输入出版时间:");
scanf("%s", b->publishTime);
time_t t = time(NULL);
strftime(b->storeTime, sizeof(b->storeTime), "%Y-%m-%d", localtime(&t)); //获取当前时间
printf("请输入库存量:");
scanf("%d", &b->stock);
b->borrow = 0;
b->next = NULL;
if (head == NULL) { //链表为空,将该结点作为头结点
head = b;
} else { //链表不为空,将该结点插入到链表尾部
book *p = head;
while (p->next != NULL) {
p = p->next;
}
p->next = b;
}
printf("录入成功!\n");
}
//删除图书
void deleteBook() {
if (head == NULL) {
printf("链表为空!\n");
return;
}
char name[100];
printf("请输入要删除的书名:");
scanf("%s", name);
book *p = head, *q = head;
while (p != NULL) {
if (strcmp(p->name, name) == 0) { //找到要删除的结点
if (p == head) { //要删除的结点是头结点
head = p->next;
} else {
q->next = p->next;
}
free(p); //释放内存
printf("删除成功!\n");
return;
} else {
q = p;
p = p->next;
}
}
printf("未找到该书!\n");
}
//修改图书
void modifyBook() {
if (head == NULL) {
printf("链表为空!\n");
return;
}
char name[100];
printf("请输入要修改的书名:");
scanf("%s", name);
book *p = head;
while (p != NULL) {
if (strcmp(p->name, name) == 0) { //找到要修改的结点
printf("请输入修改后的信息:\n");
printf("书名:");
scanf("%s", p->name);
printf("ISBN号:");
scanf("%s", p->ISBN);
printf("作者:");
scanf("%s", p->author);
printf("出版社:");
scanf("%s", p->press);
printf("出版时间:");
scanf("%s", p->publishTime);
printf("库存量:");
scanf("%d", &p->stock);
printf("修改成功!\n");
return;
} else {
p = p->next;
}
}
printf("未找到该书!\n");
}
//查询图书
void searchBook() {
if (head == NULL) {
printf("链表为空!\n");
return;
}
int choice;
char keyword[100];
printf("请选择查询方式:\n");
printf("1. 按书名查询\n");
printf("2. 按ISBN号查询\n");
printf("请输入操作编号:");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入要查询的书名:");
scanf("%s", keyword);
break;
case 2:
printf("请输入要查询的ISBN号:");
scanf("%s", keyword);
break;
default:
printf("输入有误,请重新输入!\n");
return;
}
book *p = head;
while (p != NULL) {
if (strcmp(p->name, keyword) == 0 || strcmp(p->ISBN, keyword) == 0) { //找到要查询的结点
printf("查询结果如下:\n");
printf("书名:%s\n", p->name);
printf("ISBN号:%s\n", p->ISBN);
printf("作者:%s\n", p->author);
printf("出版社:%s\n", p->press);
printf("出版时间:%s\n", p->publishTime);
printf("库存量:%d\n", p->stock);
printf("借阅数:%d\n", p->borrow);
return;
} else {
p = p->next;
}
}
printf("未找到该书!\n");
}
//借书
void borrowBook() {
if (head == NULL) {
printf("链表为空!\n");
return;
}
char name[100];
printf("请输入要借阅的书名:");
scanf("%s", name);
book *p = head;
while (p != NULL) {
if (strcmp(p->name, name) == 0) { //找到要借阅的结点
if (p->stock > 0) { //库存量大于0,可以借阅
p->stock--;
p->borrow++;
printf("借阅成功!\n");
return;
} else { //库存量等于0,无法借阅
printf("该书已全部借出!\n");
return;
}
} else {
p = p->next;
}
}
printf("未找到该书!\n");
}
//还书
void returnBook() {
if (head == NULL) {
printf("链表为空!\n");
return;
}
char name[100];
printf("请输入要归还的书名:");
scanf("%s", name);
book *p = head;
while (p != NULL) {
if (strcmp(p->name, name) == 0) { //找到要归还的结点
p->stock++;
p->borrow--;
printf("归还成功!\n");
return;
} else {
p = p->next;
}
}
printf("未找到该书!\n");
}
//统计图书
void countBook() {
if (head == NULL) {
printf("链表为空!\n");
return;
}
int sum = 0;
book *p = head;
while (p != NULL) {
sum += p->borrow;
p = p->next;
}
printf("所有借出的图书数目为:%d\n", sum);
}
//输出图书
void printBook(book *b) {
if (b == NULL) {
printf("链表为空!\n");
return;
}
printf("所有图书信息如下:\n");
printf("书名\tISBN号\t作者\t出版社\t出版时间\t入库时间\t库存量\t借阅数\n");
while (b != NULL) {
printf("%s\t%s\t%s\t%s\t%s\t%s\t%d\t%d\n", b->name, b->ISBN, b->author, b->press, b->publishTime, b->storeTime, b->stock, b->borrow);
b = b->next;
}
}
```
注意事项:
1. 该代码采用了动态链表,因此需要在每个函数中判断链表是否为空。
2. 录入图书时,获取入库时间采用了当前系统时间,需要包含头文件time.h。
3. 借书时,需要先判断库存量是否大于0,否则无法借阅。
4. 输出图书时,采用了表格形式,需要注意格式对齐。
阅读全文