赞
踩
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");
- }
-
- }
图书管理系统分享就到此结束啦,大家赶紧试试吧!
(而且你可以在群里面交流提问C语言/C++的相关编程问题哦!)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。