欢迎大家来到IT世界,在知识的湖畔探索吧!
hello,各位小伙伴们大家好!你们今天有敲代码嘛?
管理系统一直是我们计算机专业同学都要经历的项目设计,而管理系统的核心知识点其实都是一样的,无法就是换了个马甲,今天我们就来看看很多同学都会遇到的管理项目之一:图书管理系统!
用于图书信息的管理。包括图书信息的创建、图书信息的打印、图书信息的查询、图书信息的修改、图书信息的删除。方便用户整理图书,查询图书。
这个图书管理系统是由单链表这一数据结构实现的,板块包括图书信息的创建、打印、查询、修改、删除、以及图书价格的排序等组成。
代码后面也有注释的,基本很好理解的。
下面为源代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> //3.数据的设计 //3.1程序的数据存储--->容器 //3.2数据的结构 --->图书的信息 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 = 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; } //尾插法 /*struct insertNodeByTall(struct Node* headNode, int data) { struct Node* pMove = headNode; while (pMove != NULL) { pMove = pMove->next; } struct Node* newNode = createHead(data); pMove->next = newNode; }*/ //指定删除(删除链表中元素) //posLeftNode->next=posNode->next; //free(posNode); 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数量\n"); while (pMove != NULL) { printf("%s\t%.1f\t%d\n", pMove->data.name, pMove->data.price, pMove->data.num); pMove = pMove->next; } } //直接文件操作 //文件写操作 void saveInfoToFile(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 = q->data; q->data = q->next->data; q->next->data = tempData; } } } printList(headNode); } //2.交互 void keyDown() { int userkey = 0; struct bookInfo tempBook; //产生一个临时的变量存储书籍信息 struct Node* result = NULL; scanf("%d", &userkey); switch (userkey) { case 0: printf(" 【 登记 】 \n"); printf("输入书籍的信息(name,price,num):"); scanf("%s%f%d", tempBook.name, &tempBook.price, &tempBook.num); insertNodeByHead(list, tempBook); saveInfoToFile("bookinfo.txt", list); break; case 1: printf(" 【 浏览 】 \n"); printList(list); break; case 2: 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"); saveInfoToFile("bookinfo.txt", list); } else { printf("当前书籍无库存,借阅失败!\n"); } } break; case 3: printf(" 【 归还 】 \n"); printf("请输入你要归还的书籍:"); scanf("%s", tempBook.name); result = searchByName(list, tempBook.name); if (result == NULL) printf("书籍来源非法!\n"); else { result->data.num++; printf("书籍归还成功!\n"); saveInfoToFile("bookinfo.txt", list); } break; case 4: printf(" 【 查找 】 \n"); printf("你要查询的书名:"); scanf("%s", tempBook.name); result = searchByName(list, tempBook.name); if (result == NULL) { printf("未找到相关结果!\n"); } else { printf("书名\t价格\t数量\n"); printf("%s\t%.1f\t%d\n", result->data.name, result->data.price, result->data.num); } break; case 5: printf(" 【 排序 】 \n"); bubbleSortList(list); break; case 6: printf(" 【 删除 】 \n"); printf("输入想要删除的书名:"); scanf("%s", tempBook.name); deleteNodeByName(list, tempBook.name); saveInfoToFile("bookinfo.txt", list); break; case 7: printf(" 【 退出 】 \n"); printf(" 退出成功 \n"); system("pause"); exit(0); //关掉整个程序 break; default: printf(" 【 error 】 \n"); break; } } //1.界面--->菜单--->模块 void makeMenu() { printf("----------------------------------\n"); printf(" 图书管理借阅系统\n"); printf("t0.登记书籍\n"); printf("t1.浏览书籍\n"); printf("t2.借阅书籍\n"); printf("t3.归还书籍\n"); printf("t4.查找书籍\n"); printf("t5.排序书籍\n"); printf("t6.删除书籍\n"); printf("t7.退出系统\n"); printf("----------------------------------\n"); printf("请输入(0~7):"); } int main() { list = createHead(); //链表初始化 readInfoFromFile("bookinfo.txt", list); while (1) { makeMenu(); keyDown(); system("pause"); system("cls"); } }
欢迎大家来到IT世界,在知识的湖畔探索吧!
图书管理系统分享就到此结束啦,大家赶紧试试吧!
更多项目源码获取通道:
关注私信【编程交流】可到我学习粉丝群领取!
而且你可以在群里面交流提问C语言/C++的相关编程问题哦!
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/78110.html