C语言链表实现简单图书管理系统
本文实例为大家分享了C语言链表实现图书管理系统的具体代码,供大家参考,具体内容如下
实现功能:
用C语言制作图书管理系统,实现图书进行登记书籍,浏览书籍,借阅书籍,归还书籍,书籍排序,删除书籍信息,查找书籍等功能。
功能展示
1.登记书籍
【C语言链表实现简单图书管理系统】
文章图片
2.浏览书籍
文章图片
3.借阅书籍
文章图片
4.归还书籍
文章图片
5.书籍排序
文章图片
6.删除书籍
文章图片
7.查找书籍
文章图片
8.退出程序
文章图片
代码如下
#define _CRT_SECURE_NO_WARNINGS#include#include#include struct bookInfo{char name[20]; float price; 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 = https://www.it610.com/article/data; newNode->next = NULL; return newNode; } void insertNodeByhead(struct Node* headNode, struct bookInfo data){struct Node* newNode = createNode(data); newNode->next = headNode->next; headNode->next = newNode; } void deleteNodeByName(struct Node* headNode, char *bookName){struct Node* posLeftNode = headNode; struct Node* posNode = headNode->next; while (posNode != NULL && strcmp(posNode->data.name, bookName)){posLeftNode = posNode; posNode = posLeftNode->next; }if (posNode == NULL)return; else{printf("删除成功!\n"); posLeftNode->next = posNode->next; free(posNode); posNode = NULL; }}struct Node* searchByName(struct Node* headNode, char* bookName){struct Node* posNode = headNode->next; while (posNode != NULL && strcmp(posNode->data.name, bookName)){posNode = posNode->next; }return posNode; } void printlist(struct Node* headNode){struct Node* pMove = headNode->next; printf("书名\t价格\t数量\t作者\t出版社\n"); while (pMove!=NULL){printf("%s\t%.1f\t%d\n", pMove->data.name, pMove->data.price, pMove->data.num); pMove = pMove->next; }} 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("请输入(0 ~ 7):"); } void saveInfoFile(const char* fileName, struct Node* headNode){FILE* fp = fopen(fileName, "w"); struct Node* pMove = headNode->next; while (pMove != NULL){fprintf(fp, "%s\t%.1f\t%d\n", pMove->data.name, pMove->data.price, pMove->data.num); pMove = pMove->next; }fclose(fp); } void readInfoFromFile(const char* fileName, struct Node* headNode){FILE* fp = fopen(fileName, "r"); if (fp == NULL){fp = fopen(fileName, "w+"); }struct bookInfo tempData; while (fscanf(fp, "%s\t%f\t%d\n", tempData.name, &tempData.price, &tempData.num) != EOF){insertNodeByhead(list, tempData); }fclose(fp); } 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.price > q->next->data.price){struct bookInfo tempData = https://www.it610.com/article/q->data; q->data = https://www.it610.com/article/q->next->data; q->next->data = https://www.it610.com/article/tempData; }}}printlist(headNode); } void keyDown(){int userKey = 0; struct bookInfo tempBook; struct Node* result = NULL; scanf("%d",&userKey); switch (userKey){case 0:printf("【退出】\n"); printf("退出成功\n"); system("pause"); exit(0); break; case 1:printf("【登记】\n"); printf("输入书籍的信息(name,price,num):"); scanf("%s%f%d", tempBook.name, &tempBook.price, &tempBook.num); insertNodeByhead(list, tempBook); saveInfoFile("bookinfo.txt", list); break; case 2:printf("【浏览】\n"); printlist(list); break; case 3:printf("【借阅】\n"); printf("请输入借阅的书名:"); scanf("%s", tempBook.name); result = searchByName(list, tempBook.name); if (result == NULL){printf("没有相关书籍无法借阅!\n"); }else{if (result->data.num > 0){result->data.num--; printf("借阅成功!\n"); }else{printf("当前书籍无库存,借阅失败!\n"); }}break; case 4:printf("【归还】\n"); printf("请输入归还的书名:"); scanf("%s", tempBook.name); result = searchByName(list, tempBook.name); if (result == NULL){printf("该书无借出记录\n"); }else{result->data.num++; printf("书籍归还成功!\n"); }break; case 5:printf("【排序】\n"); bubbleSortlist(list); break; case 6:printf("【删除】\n"); printf("请输入删除书名:"); scanf("%s", tempBook.name); deleteNodeByName(list, tempBook.name); saveInfoFile("bookinfo.txt", list); break; case 7:printf("【查找】\n"); printf("请输入要查询的书名:"); scanf("%s", tempBook.name); result = searchByName(list, tempBook.name); if (result == NULL){printf("未找到相关信息!\n"); }else{printf("书名\t价格\t数量\t作者\t出版社\n"); printf("%s\t%.1f\t%d\n", result->data.name, result->data.price, result->data.num); }break; default:printf("【error】\n"); break; }} int main(){list= createHead(); readInfoFromFile("bookinfo.txt", list); while (1){makeMenu(); keyDown(); system("pause"); system("cls"); }system("pause"); return 0; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
推荐阅读
- C语言实现带头双向循环链表的接口
- 基于Java+SpringBoot+vue+element实现扶贫助农政策平台系统
- 面试官(Redis中哈希数据类型的内部实现方式是什么())
- threejs+vue3实现烟花效果
- C语言数据结构之图书借阅系统
- C++实现双向链表代码分析
- 使用Mybatis如何实现删除多个数据
- 创新研发高通量芯片技术,JASMINER实现区块链芯片大突破
- Vben-Admin的useForm实现思路详解,以及实现element版的useForm
- 面试官(Redis中列表的内部实现方式是什么())