当前位置:   article > 正文

C/C++项目开发:图书管理系统,数据结构全源码分享_c++图书管理系统课程设计源代码

c++图书管理系统课程设计源代码

hello,各位小伙伴们大家好!你们今天有敲代码嘛?

管理系统一直是我们计算机专业同学都要经历的项目设计,而管理系统的核心知识点其实都是一样的,无法就是换了个马甲,今天我们就来看看很多同学都会遇到的管理项目之一:图书管理系统

用于图书信息的管理。包括图书信息的创建、图书信息的打印、图书信息的查询、图书信息的修改、图书信息的删除。方便用户整理图书,查询图书。

这个图书管理系统是由单链表这一数据结构实现的,板块包括图书信息的创建、打印、查询、修改、删除、以及图书价格的排序等组成。

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

相关教程:https://www.bilibili.com/video/BV11p4y1i7JH/?spm_id_from=333.999.0.0&vd_source=0b6de313718f23eb57742248fbe7b823icon-default.png?t=N7T8https://www.bilibili.com/video/BV11p4y1i7JH/?spm_id_from=333.999.0.0&vd_source=0b6de313718f23eb57742248fbe7b823

下面为源代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. //3.数据的设计
  5. //3.1程序的数据存储--->容器
  6. //3.2数据的结构 --->图书的信息
  7. struct bookInfo
  8. {
  9. char name[20]; //书名
  10. float price; //书籍的价格
  11. int num; //书籍的数量
  12. };
  13. //定义链表
  14. struct Node
  15. {
  16. struct bookInfo data;
  17. struct Node* next;
  18. };
  19. struct Node* list = NULL; //将链表声明成全局变量
  20. //创建表头:表头就是结构体变量
  21. struct Node* createHead()
  22. {
  23. //动态内存申请
  24. struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));
  25. //变量初始化
  26. headNode->next = NULL;
  27. return headNode;
  28. }
  29. //创建节点:为插入做准备
  30. // 把用户的数据变成结构体变量
  31. struct Node* createNode(struct bookInfo data)
  32. {
  33. struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
  34. newNode->data = data;
  35. newNode->next = NULL;
  36. return newNode;
  37. }
  38. //数据插入(头插法)
  39. void insertNodeByHead(struct Node* headNode, struct bookInfo data)
  40. {
  41. struct Node* newNode = createNode(data);
  42. newNode->next = headNode->next;
  43. headNode->next = newNode;
  44. }
  45. //尾插法
  46. /*struct insertNodeByTall(struct Node* headNode, int data)
  47. {
  48. struct Node* pMove = headNode;
  49. while (pMove != NULL)
  50. {
  51. pMove = pMove->next;
  52. }
  53. struct Node* newNode = createHead(data);
  54. pMove->next = newNode;
  55. }*/
  56. //指定删除(删除链表中元素)
  57. //posLeftNode->next=posNode->next;
  58. //free(posNode);
  59. void deleteNodeByName(struct Node* headNode, char* bookname)
  60. {
  61. struct Node* posLeftNode = headNode;
  62. struct Node* posNode = headNode->next;
  63. //书籍名字是字符串,字符串比较函数
  64. while (posNode != NULL && strcmp(posNode->data.name, bookname))
  65. {
  66. posLeftNode = posNode;
  67. posNode = posLeftNode->next;
  68. }
  69. //讨论查找的结果
  70. if (posNode == NULL)
  71. return;
  72. else
  73. {
  74. printf("删除成功!\n");
  75. posLeftNode->next = posNode->next;
  76. free(posNode);
  77. posNode = NULL;
  78. }
  79. }
  80. //查找
  81. struct Node* searchByName(struct Node* headNode, char* bookName)
  82. {
  83. struct Node* posNode = headNode->next;
  84. while (posNode != NULL && strcmp(posNode->data.name, bookName))
  85. {
  86. posNode = posNode->next;
  87. }
  88. return posNode;
  89. }
  90. //打印链表
  91. void printList(struct Node* headNode)
  92. {
  93. struct Node* pMove = headNode->next;
  94. printf("书名\t价格\t数量\n");
  95. while (pMove != NULL)
  96. {
  97. printf("%s\t%.1f\t%d\n", pMove->data.name, pMove->data.price, pMove->data.num);
  98. pMove = pMove->next;
  99. }
  100. }
  101. //直接文件操作
  102. //文件写操作
  103. void saveInfoToFile(const char* filename, struct Node* headNode)
  104. {
  105. FILE* fp = fopen(filename, "w");
  106. struct Node* pMove = headNode->next;
  107. while (pMove != NULL)
  108. {
  109. fprintf(fp, "%s\t%.1f\t%d\n", pMove->data.name, pMove->data.price, pMove->data.num);
  110. pMove = pMove->next;
  111. }
  112. fclose(fp);
  113. }
  114. //文件读操作
  115. void readInfoFromFile(const char* fileName, struct Node* headNode)
  116. {
  117. FILE* fp = fopen(fileName, "r");
  118. if (fp == NULL)
  119. {
  120. //不存在就创建出来这个文件
  121. fp = fopen(fileName, "w+");
  122. }
  123. struct bookInfo tempData;
  124. while (fscanf(fp, "%s\t%f\t%d\n", tempData.name, &tempData.price, &tempData.num) != EOF)
  125. {
  126. insertNodeByHead(list, tempData);
  127. }
  128. fclose(fp);
  129. }
  130. //冒泡排序(链表)
  131. void bubbleSortList(struct Node* headNode)
  132. {
  133. for (struct Node* p = headNode->next; p != NULL; p = p->next)
  134. {
  135. for (struct Node* q = headNode->next; q->next != NULL; q = q->next)
  136. {
  137. if (q->data.price > q->next->data.price)
  138. {
  139. //交换值
  140. struct bookInfo tempData = q->data;
  141. q->data = q->next->data;
  142. q->next->data = tempData;
  143. }
  144. }
  145. }
  146. printList(headNode);
  147. }
  148. //2.交互
  149. void keyDown()
  150. {
  151. int userkey = 0;
  152. struct bookInfo tempBook; //产生一个临时的变量存储书籍信息
  153. struct Node* result = NULL;
  154. scanf("%d", &userkey);
  155. switch (userkey) {
  156. case 0:
  157. printf(" 【 登记 】 \n");
  158. printf("输入书籍的信息(name,price,num):");
  159. scanf("%s%f%d", tempBook.name, &tempBook.price, &tempBook.num);
  160. insertNodeByHead(list, tempBook);
  161. saveInfoToFile("bookinfo.txt", list);
  162. break;
  163. case 1:
  164. printf(" 【 浏览 】 \n");
  165. printList(list);
  166. break;
  167. case 2:
  168. printf(" 【 借阅 】 \n");
  169. printf("请输入你要借阅的书籍:");
  170. scanf("%s", tempBook.name);
  171. result = searchByName(list,tempBook.name);
  172. if (result == NULL)
  173. printf("没有相关书籍无法借阅!\n");
  174. else
  175. {
  176. if (result->data.num > 0)
  177. {
  178. result->data.num--;
  179. printf("借阅成功\n");
  180. saveInfoToFile("bookinfo.txt", list);
  181. }
  182. else
  183. {
  184. printf("当前书籍无库存,借阅失败!\n");
  185. }
  186. }
  187. break;
  188. case 3:
  189. printf(" 【 归还 】 \n");
  190. printf("请输入你要归还的书籍:");
  191. scanf("%s", tempBook.name);
  192. result = searchByName(list, tempBook.name);
  193. if (result == NULL)
  194. printf("书籍来源非法!\n");
  195. else
  196. {
  197. result->data.num++;
  198. printf("书籍归还成功!\n");
  199. saveInfoToFile("bookinfo.txt", list);
  200. }
  201. break;
  202. case 4:
  203. printf(" 【 查找 】 \n");
  204. printf("你要查询的书名:");
  205. scanf("%s", tempBook.name);
  206. result = searchByName(list, tempBook.name);
  207. if (result == NULL)
  208. {
  209. printf("未找到相关结果!\n");
  210. }
  211. else
  212. {
  213. printf("书名\t价格\t数量\n");
  214. printf("%s\t%.1f\t%d\n", result->data.name, result->data.price, result->data.num);
  215. }
  216. break;
  217. case 5:
  218. printf(" 【 排序 】 \n");
  219. bubbleSortList(list);
  220. break;
  221. case 6:
  222. printf(" 【 删除 】 \n");
  223. printf("输入想要删除的书名:");
  224. scanf("%s", tempBook.name);
  225. deleteNodeByName(list, tempBook.name);
  226. saveInfoToFile("bookinfo.txt", list);
  227. break;
  228. case 7:
  229. printf(" 【 退出 】 \n");
  230. printf(" 退出成功 \n");
  231. system("pause");
  232. exit(0); //关掉整个程序
  233. break;
  234. default:
  235. printf(" 【 error 】 \n");
  236. break;
  237. }
  238. }
  239. //1.界面--->菜单--->模块
  240. void makeMenu()
  241. {
  242. printf("----------------------------------\n");
  243. printf(" 图书管理借阅系统\n");
  244. printf("t0.登记书籍\n");
  245. printf("t1.浏览书籍\n");
  246. printf("t2.借阅书籍\n");
  247. printf("t3.归还书籍\n");
  248. printf("t4.查找书籍\n");
  249. printf("t5.排序书籍\n");
  250. printf("t6.删除书籍\n");
  251. printf("t7.退出系统\n");
  252. printf("----------------------------------\n");
  253. printf("请输入(0~7):");
  254. }
  255. int main()
  256. {
  257. list = createHead(); //链表初始化
  258. readInfoFromFile("bookinfo.txt", list);
  259. while (1)
  260. {
  261. makeMenu();
  262. keyDown();
  263. system("pause");
  264. system("cls");
  265. }
  266. }

图书管理系统分享就到此结束啦,大家赶紧试试吧!

更多项目源码获取通道:

而且你可以在群里面交流提问C语言/C++的相关编程问题哦!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/499863
推荐阅读
相关标签
  

闽ICP备14008679号