数据结构图书管理系统

news/2024/10/20 17:30:55/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//图书的结构体
struct bookInfo
{char book_num[10];//编号char book_name[20];//书名char book_write[20];//作者float privce;//价格int num;//数量
};
//关于图书信息的链表
struct Node
{struct bookInfo data;struct Node* next;
};
struct Node* list = NULL;//全局链表
//创建表头(头结点)
struct Node* createHead()
{//动态申请struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));//表头不存放数据域,所以不用初始化headNode->next = NULL;return headNode;
}
//创建节点(首元节点以及后续的节点)  每个节点都是带有图书结构体的存在
struct Node* createNode(struct bookInfo data)
{struct Node* newnode = (struct Node*)malloc(sizeof(struct Node));newnode->data = data;newnode->next = NULL;return newnode;}
//打印链表
void printlist(struct Node* headNode)
{struct Node* pMove = headNode->next;printf("编号  书名  作者  价格  数量\t\n");while (pMove){printf("%2s %6s %6s %5.1f %4d\n", pMove->data.book_num, pMove->data.book_name, pMove->data.book_write, pMove->data.privce, pMove->data.num);pMove = pMove->next;}
}
//插入节点(头插)
void insertNodeByHead(struct Node* headNode, struct bookInfo data)
{//动态申请节点空间struct Node* newnode = createNode(data);newnode->next = headNode->next;headNode->next = newnode;
}
//删除  使用书籍名称进行删除
void deleteNodeByData(struct Node* headNode, char* book_name)
{struct Node* posLeftNode = headNode;struct Node* posNode = headNode->next;while (posNode != NULL && strcmp(posNode->data.book_name,book_name))//!=0{posLeftNode = posNode;posNode = posNode->next;}if (posNode == NULL){return;}else{posLeftNode->next = posNode->next;free(posNode);posNode = NULL;}
}
//查找
struct Node* FindName(struct Node* headNode, char* book_name)
{struct Node* find = headNode->next;while (find!= NULL && strcmp(find->data.book_name,book_name))//!=0{find = find->next;}return find;
}
void makemenu()
{printf("-------------------------\n");printf("       图书管理系统      \n");printf("       0 退出系统        \n");printf("       1 登记书籍        \n");printf("       2 浏览书籍        \n");printf("       3 借阅书籍        \n");printf("       4 归还书籍        \n");printf("       5 书籍排序        \n");printf("       6 删除书籍        \n");printf("       7 查找书籍        \n");printf("-------------------------\n");printf("\n--------请输入0-7--------\n");
}
//存文件操作
void saveInfotoFile(const char* filename, struct Node* headNode)
{FILE* pf = fopen(filename, "w");//存内容到文件。无非就是打印到文本文件struct Node* pMove = headNode->next;while (pMove != NULL){//存操作fprintf(pf,"%s\t%s\t%s\t%f\t%d\n", pMove->data.book_num, pMove->data.book_name, pMove->data.book_write, pMove->data.privce, pMove->data.num);pMove = pMove->next;}fclose(pf);
}
//读文件操作
void readInfofromFile(const char* filename, struct Node* headNode)
{FILE* pf = fopen(filename, "r");if (pf == NULL){pf = fopen(filename, "w+");}struct bookInfo tempdata;while (fscanf(pf,"%s\t%s\t%s\t%f\t%d\n", tempdata.book_num, tempdata.book_name, tempdata.book_write, &tempdata.privce, &tempdata.num)!=EOF){insertNodeByHead(list, tempdata);}fclose(pf);
}
//价格排序
void bubbleSortlist(struct Node* headNode)
{for (struct Node* p = headNode->next; p != NULL; p = p->next){for (struct Node* q = headNode->next; q->next != NULL; q = q->next){if (q->data.privce > q->next->data.privce){struct bookInfo temp = q->data;q->data = q->next->data;q->next->data = temp;}}}printlist(headNode);
}
void keyDown()
{int input = 0;struct bookInfo tempbook;//临时存储书籍信息struct Node* Find_Book = NULL;//用来查找函数的接收scanf("%d", &input);switch (input){case 0:printf("退出成功\n");exit(0);break;case 1:printf("【登记】\n");printf("请输入书籍的编号\n");scanf("%s", tempbook.book_num);printf("请输入书籍的书名\n");scanf("%s", tempbook.book_name);printf("请输入书籍的作者\n");scanf("%s", tempbook.book_write);printf("请输入书籍的价格\n");scanf("%f", &tempbook.privce);printf("请输入书籍的数量\n");scanf("%d", &tempbook.num);printf("\t登记成功\n");insertNodeByHead(list, tempbook);saveInfotoFile("boolinfo.txt", list);break;case 2:printf("【浏览】\n");printlist(list);break;case 3:printf("【借阅】\n");printf("请输入借阅的书名\n");scanf("%s", tempbook.book_name);Find_Book = FindName(list, tempbook.book_name);if (Find_Book == NULL){printf("没有相关书籍,无法借阅\n");}else{if (Find_Book->data.num > 0){Find_Book->data.num--;saveInfotoFile("boolinfo.txt", list);//同步到文本文件中去printf("借阅成功\n");}else{printf("当前书籍无库存,无法借阅\n");}}break;case 4:printf("【归还】\n");printf("请输入归还的书名\n");scanf("%s", tempbook.book_name);Find_Book = FindName(list, tempbook.book_name);if (Find_Book == NULL){printf("非法操作,这书不是本书店\n");}else{Find_Book->data.num++;saveInfotoFile("boolinfo.txt", list);//同步到文本文件中去printf("书本归还成功\n");}break;case 5:printf("【排序】\n");bubbleSortlist(list);break;case 6:printf("【删除】\n");printf("请输入删除书本名字\n");scanf("%s", tempbook.book_name);Find_Book = FindName(list, tempbook.book_name);if (Find_Book == NULL){printf("要删除的书籍不存在,删除失败\n");}else{deleteNodeByData(list, tempbook.book_name);//删除后要同步到文本文件saveInfotoFile("boolinfo.txt", list);printf("删除成功\n");}break;case 7:printf("【查找】\n");printf("请输入要查找的书本的名字\n");scanf("%s", tempbook.book_name);Find_Book = FindName(list, tempbook.book_name);if (Find_Book == NULL){printf("查询不到这本书\n");}else {printf("编号  书名  作者  价格  数量\t\n");printf("%2s %6s %6s %5.1f %4d\n", Find_Book->data.book_num, Find_Book->data.book_name, Find_Book->data.book_write, Find_Book->data.privce, Find_Book->data.num);}default:printf("请输入0-7\n");break;}
}
int main()
{list = createHead();readInfofromFile("boolinfo.txt", list);while (1){makemenu();keyDown();system("pause");system("cls");}return 0;
}  

注意:如果第一次代码运行后CMD显示黑屏,可以先这样↓

int main()
{list = createHead();while (1){makemenu();keyDown();system("pause");system("cls");}readInfofromFile("boolinfo.txt", list);return 0;
}

把readInfofromFile("boolinfo.txt", list);放在while下面先,然后正常的添加书籍之后(即case 1:)后再把readInfofromFile("boolinfo.txt", list);放回到while循环上面;


http://www.ppmy.cn/news/1506122.html

相关文章

谷粒商城实战笔记-151-缓存-缓存使用-本地缓存与分布式缓存

文章目录 一&#xff0c;本地缓存1&#xff0c;定义 2&#xff0c;优点3&#xff0c;代码示例&#xff08;Java&#xff09;4&#xff0c;缺点 二&#xff0c;分布式缓存1&#xff0c;定义2&#xff0c;优点3&#xff0c;缺点4&#xff0c;代码示例 三&#xff0c;本地缓存与分…

C语言 ——— 学习并使用字符分类函数

目录 学习isupper函数 学习isdigit函数 学习tolower函数 将输入的字符串中把大写字母转换为小写字母并输出 学习isupper函数 参数部分&#xff1a; 形参需要传递的是一个字母&#xff0c;字符在ASCII码表上是以整型存储的&#xff0c;所以实参部分用(int c)没有问题 返回…

Go 临界资源 安全问题

临界资源安全的问题&#xff1a; 临界资源&#xff1a; 指并发环境中多个 进程/线程/协程 可以共享&#xff08;都可以调用&#xff09;的资源/变量&#xff0c;如果在并发环境中处理不当&#xff0c;就会造成一些 严重、问题 func main() {//临界资源a : 10go func() {a 100f…

LLM金融文本分类文档说明

Python注意事项&#xff1a; 1&#xff0c;创建虚拟环境&#xff1a; conda create --prefixD:\software\Anaconda3\envs\finance_analysis python3.10.4 conda create -p D:/software/anaconda3/envs/finance_analysis python3.10.4 注释&#xff1a; D:\software\anaconda3\e…

redolog和binlog的两阶段提交和区别

redolog和binlog区别 redo log 是 InnoDB 引擎特有的&#xff1b;binlog 是 MySQL 的 Server 层实现的&#xff0c;所有引擎都可以使用。redo log 是物理日志&#xff0c;记录的是“在某个数据页上做了什么修改”&#xff1b;binlog 是逻辑日志&#xff0c;记录的是这个语句的…

<数据集>柑橘缺陷识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1290张 标注数量(xml文件个数)&#xff1a;1290 标注数量(txt文件个数)&#xff1a;1290 标注类别数&#xff1a;4 标注类别名称&#xff1a;[Orange-Green-Black-Spot, Orange-Black-Spot, Orange-Canker, Orange…

java基础I/O

1,I/O流的概念&#xff1a; IO流代表的是一个数据输入的源或者输出的目标地址&#xff0c;可以是硬盘&#xff0c;内存&#xff0c;网络或者什么其他的电子设备&#xff0c;而IO流的类型也很多比如最简单的字节或者字符&#xff0c;或者其他更高级的对象。 不管它有多少特性&am…

AI10-PaddleDetection2.7安装测试

1、下载PaddleDetect-release-2.7开源项目 https://github.com/PaddlePaddle/PaddleDetection https://github.com/PaddlePaddle/PaddleDetection/releases PaddleDetection: PaddleDetection的目的是为工业界和学术界提供丰富、易用的目标检测模型 2、安装 环境要求 * Paddl…