管理系统一直是我们计算机专业同学都要经历的项目设计,而管理系统的核心知识点其实都是一样的,无法就是换了个马甲,今天我们就来看看很多同学都会遇到的管理项目之一:图书管理系统!
用于图书信息的管理。包括图书信息的创建、图书信息的打印、图书信息的查询、图书信息的修改、图书信息的删除。方便用户整理图书,查询图书。
这个图书管理系统是由单链表这一数据结构实现的,板块包括图书信息的创建、打印、查询、修改、删除、以及图书价格的排序等组成。

代码后面也有注释的,基本很好理解的。
下面为源代码:

#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");}}
图书管理系统分享就到此结束啦,大家赶紧试试吧!
更多项目源码获取通道:
关注私信【编程交流】可到我学习粉丝群领取!
而且你可以在群里面交流提问C语言/C++的相关编程问题哦!