c语言图书管理系统用链表实现,要有录入,删除,修改,查询,还书,借书,统计,输出
时间: 2023-10-07 12:11:36 浏览: 195
好的,这是一个比较复杂的项目,需要考虑很多细节。以下是我给出的一些思路:
1. 定义书籍的数据结构:包括书名、作者、出版社、出版日期、ISBN号、分类号、价格等信息。
2. 定义链表结构:每个节点包括书籍信息以及指向下一个节点的指针。
3. 录入:可以通过文件读入的方式,将图书信息一次性录入系统中。
4. 删除:根据书名或ISBN号进行删除,需要遍历整个链表进行查找。
5. 修改:根据书名或ISBN号进行修改,需要遍历整个链表进行查找。
6. 查询:根据书名、作者、出版社、出版日期、ISBN号、分类号等信息进行查询,可以通过遍历链表来实现。
7. 借书:根据读者信息和图书信息进行借书操作,可以将借书信息保存在一个借阅表中,同时需要将该图书的状态改为“已借出”。
8. 还书:根据读者信息和图书信息进行还书操作,需要在借阅表中查找该读者的借书记录,并将该记录从借阅表中删除,同时需要将该图书的状态改为“可借阅”。
9. 统计:可以统计图书总数、借出图书数量、可借阅图书数量等信息。
10. 输出:可以将图书信息以表格形式输出到文件中,也可以在终端中显示出来。
以上是一个大致的思路,具体实现细节还需要根据具体情况进行调整。希望这些思路能够对你有所帮助!
相关问题
c语言图书管理系统用链表实现,要有录入,删除,修改,查询,还书,借书,统计,输出
好的,以下是一个简单的基于链表实现图书管理系统的代码,包含录入、删除、修改、查询、还书、借书、统计和输出功能。
```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()` 函数释放内存。
用C语言写一个用链表数据结构实现的图书管理系统,要求包括8个数据项:书名、ISBN、作者、出版社、出版时间、入库时间、库存量、借阅数,并完成以下操作,录入、删除、修改、查询、借书、还书、统计、输出
好的,下面是用链表数据结构实现的图书管理系统的 C 语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
// 定义图书信息结构体
typedef struct Book {
char name[50]; // 书名
char ISBN[20]; // ISBN
char author[20]; // 作者
char publisher[20]; // 出版社
char publish_time[20];// 出版时间
char enter_time[20]; // 入库时间
int stock; // 库存量
int borrowed; // 借阅数
struct Book *next; // 指向下一个节点的指针
} Book;
// 定义链表头指针
Book *head = NULL;
// 函数声明
void add_book();
void delete_book();
void update_book();
void search_book();
void borrow_book();
void return_book();
void statistics();
void output();
void save_file();
void load_file();
int main() {
int choice;
load_file(); // 读取文件中的图书信息
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("***************************\n");
printf("请输入您的选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
add_book();
break;
case 2:
delete_book();
break;
case 3:
update_book();
break;
case 4:
search_book();
break;
case 5:
borrow_book();
break;
case 6:
return_book();
break;
case 7:
statistics();
break;
case 8:
output();
break;
case 0:
save_file(); // 保存图书信息到文件中
exit(0);
default:
printf("输入有误,请重新输入。\n");
}
}
return 0;
}
// 添加图书
void add_book() {
Book *new_book = (Book *) malloc(sizeof(Book));
printf("请输入书名:");
scanf("%s", new_book->name);
printf("请输入ISBN:");
scanf("%s", new_book->ISBN);
printf("请输入作者:");
scanf("%s", new_book->author);
printf("请输入出版社:");
scanf("%s", new_book->publisher);
printf("请输入出版时间(例如:2022-01-01):");
scanf("%s", new_book->publish_time);
time_t t = time(NULL);
struct tm *tm = localtime(&t);
sprintf(new_book->enter_time, "%04d-%02d-%02d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday);
printf("请输入库存量:");
scanf("%d", &new_book->stock);
new_book->borrowed = 0;
new_book->next = NULL;
if (head == NULL) {
head = new_book;
} else {
Book *current_book = head;
while (current_book->next != NULL) {
current_book = current_book->next;
}
current_book->next = new_book;
}
printf("添加成功!\n");
}
// 删除图书
void delete_book() {
char name[50];
printf("请输入要删除的书名:");
scanf("%s", name);
if (head == NULL) {
printf("列表为空,无法删除。\n");
return;
}
Book *current_book = head;
Book *previous_book = NULL;
while (current_book != NULL) {
if (strcmp(current_book->name, name) == 0) {
if (previous_book == NULL) {
head = current_book->next;
} else {
previous_book->next = current_book->next;
}
free(current_book);
printf("删除成功!\n");
return;
}
previous_book = current_book;
current_book = current_book->next;
}
printf("图书不存在,无法删除。\n");
}
// 修改图书
void update_book() {
char name[50];
printf("请输入要修改的书名:");
scanf("%s", name);
Book *current_book = head;
while (current_book != NULL) {
if (strcmp(current_book->name, name) == 0) {
printf("请输入新的书名:");
scanf("%s", current_book->name);
printf("请输入新的ISBN:");
scanf("%s", current_book->ISBN);
printf("请输入新的作者:");
scanf("%s", current_book->author);
printf("请输入新的出版社:");
scanf("%s", current_book->publisher);
printf("请输入新的出版时间(例如:2022-01-01):");
scanf("%s", current_book->publish_time);
printf("请输入新的库存量:");
scanf("%d", ¤t_book->stock);
printf("修改成功!\n");
return;
}
current_book = current_book->next;
}
printf("图书不存在,无法修改。\n");
}
// 查找图书
void search_book() {
char name[50];
printf("请输入要查找的书名:");
scanf("%s", name);
Book *current_book = head;
while (current_book != NULL) {
if (strcmp(current_book->name, name) == 0) {
printf("书名:%s\n", current_book->name);
printf("ISBN:%s\n", current_book->ISBN);
printf("作者:%s\n", current_book->author);
printf("出版社:%s\n", current_book->publisher);
printf("出版时间:%s\n", current_book->publish_time);
printf("库存量:%d\n", current_book->stock);
printf("借阅数:%d\n", current_book->borrowed);
return;
}
current_book = current_book->next;
}
printf("图书不存在。\n");
}
// 借阅图书
void borrow_book() {
char name[50];
printf("请输入要借阅的书名:");
scanf("%s", name);
Book *current_book = head;
while (current_book != NULL) {
if (strcmp(current_book->name, name) == 0) {
if (current_book->stock > 0) {
current_book->stock--;
current_book->borrowed++;
printf("借阅成功!\n");
} else {
printf("库存不足,无法借阅。\n");
}
return;
}
current_book = current_book->next;
}
printf("图书不存在,无法借阅。\n");
}
// 归还图书
void return_book() {
char name[50];
printf("请输入要归还的书名:");
scanf("%s", name);
Book *current_book = head;
while (current_book != NULL) {
if (strcmp(current_book->name, name) == 0) {
if (current_book->borrowed > 0) {
current_book->stock++;
current_book->borrowed--;
printf("归还成功!\n");
} else {
printf("该图书没有借阅记录,无法归还。\n");
}
return;
}
current_book = current_book->next;
}
printf("图书不存在,无法归还。\n");
}
// 统计信息
void statistics() {
int total_stock = 0;
int total_borrowed = 0;
int total = 0;
Book *current_book = head;
while (current_book != NULL) {
total_stock += current_book->stock;
total_borrowed += current_book->borrowed;
total++;
current_book = current_book->next;
}
printf("图书总数:%d\n", total);
printf("库存总量:%d\n", total_stock);
printf("借阅总数:%d\n", total_borrowed);
}
// 输出图书列表
void output() {
printf("书名\tISBN\t作者\t出版社\t出版时间\t入库时间\t库存量\t借阅数\n");
Book *current_book = head;
while (current_book != NULL) {
printf("%s\t%s\t%s\t%s\t%s\t%s\t%d\t%d\n", current_book->name, current_book->ISBN,
current_book->author, current_book->publisher, current_book->publish_time,
current_book->enter_time, current_book->stock, current_book->borrowed);
current_book = current_book->next;
}
}
// 保存图书信息到文件中
void save_file() {
FILE *fp = fopen("book.txt", "w");
if (fp == NULL) {
printf("文件打开失败。\n");
return;
}
Book *current_book = head;
while (current_book != NULL) {
fprintf(fp, "%s %s %s %s %s %s %d %d\n", current_book->name, current_book->ISBN,
current_book->author, current_book->publisher, current_book->publish_time,
current_book->enter_time, current_book->stock, current_book->borrowed);
current_book = current_book->next;
}
fclose(fp);
}
// 读取文件中的图书信息
void load_file() {
char name[50];
char ISBN[20];
char author[20];
char publisher[20];
char publish_time[20];
char enter_time[20];
int stock;
int borrowed;
FILE *fp = fopen("book.txt", "r");
if (fp == NULL) {
printf("文件打开失败。\n");
return;
}
while (fscanf(fp, "%s %s %s %s %s %s %d %d\n", name, ISBN, author, publisher, publish_time, enter_time, &stock, &borrowed) != EOF) {
Book *new_book = (Book *) malloc(sizeof(Book));
strcpy(new_book->name, name);
strcpy(new_book->ISBN, ISBN);
strcpy(new_book->author, author);
strcpy(new_book->publisher, publisher);
strcpy(new_book->publish_time, publish_time);
strcpy(new_book->enter_time, enter_time);
new_book->stock = stock;
new_book->borrowed = borrowed;
new_book->next = NULL;
if (head == NULL) {
head = new_book;
} else {
Book *current_book = head;
while (current_book->next != NULL) {
current_book = current_book->next;
}
current_book->next = new_book;
}
}
fclose(fp);
}
```
其中,我们用 `Book` 结构体来存储图书信息,定义了链表头指针 `head`,并实现了以下操作:
- 添加图书
- 删除图书
- 修改图书
- 查找图书
- 借阅图书
- 归还图书
- 统计信息
- 输出图书列表
另外,我们还实现了将图书信息保存到文件和从文件中读取图书信息的函数 `save_file()` 和 `load_file()`。这样,在程序运行结束时,可以将图书信息保存到文件中,下次运行程序时可以读取文件中的图书信息。
注意:由于没有对输入做过多判断和处理,所以输入不规范的数据可能会导致程序崩溃,请谨慎使用。另外,由于时间和精力有限,代码可能存在一些潜在的问题,如有发现,请指出。
阅读全文