当前位置:   article > 正文

数据结构图书管理系统

数据结构图书管理系统
  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. //图书的结构体
  6. struct bookInfo
  7. {
  8. char book_num[10];//编号
  9. char book_name[20];//书名
  10. char book_write[20];//作者
  11. float privce;//价格
  12. int num;//数量
  13. };
  14. //关于图书信息的链表
  15. struct Node
  16. {
  17. struct bookInfo data;
  18. struct Node* next;
  19. };
  20. struct Node* list = NULL;//全局链表
  21. //创建表头(头结点)
  22. struct Node* createHead()
  23. {
  24. //动态申请
  25. struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));
  26. //表头不存放数据域,所以不用初始化
  27. headNode->next = NULL;
  28. return headNode;
  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 printlist(struct Node* headNode)
  40. {
  41. struct Node* pMove = headNode->next;
  42. printf("编号 书名 作者 价格 数量\t\n");
  43. while (pMove)
  44. {
  45. printf("%2s %6s %6s %5.1f %4d\n", pMove->data.book_num, pMove->data.book_name, pMove->data.book_write, pMove->data.privce, pMove->data.num);
  46. pMove = pMove->next;
  47. }
  48. }
  49. //插入节点(头插)
  50. void insertNodeByHead(struct Node* headNode, struct bookInfo data)
  51. {
  52. //动态申请节点空间
  53. struct Node* newnode = createNode(data);
  54. newnode->next = headNode->next;
  55. headNode->next = newnode;
  56. }
  57. //删除 使用书籍名称进行删除
  58. void deleteNodeByData(struct Node* headNode, char* book_name)
  59. {
  60. struct Node* posLeftNode = headNode;
  61. struct Node* posNode = headNode->next;
  62. while (posNode != NULL && strcmp(posNode->data.book_name,book_name))//!=0
  63. {
  64. posLeftNode = posNode;
  65. posNode = posNode->next;
  66. }
  67. if (posNode == NULL)
  68. {
  69. return;
  70. }
  71. else
  72. {
  73. posLeftNode->next = posNode->next;
  74. free(posNode);
  75. posNode = NULL;
  76. }
  77. }
  78. //查找
  79. struct Node* FindName(struct Node* headNode, char* book_name)
  80. {
  81. struct Node* find = headNode->next;
  82. while (find!= NULL && strcmp(find->data.book_name,book_name))//!=0
  83. {
  84. find = find->next;
  85. }
  86. return find;
  87. }
  88. void makemenu()
  89. {
  90. printf("-------------------------\n");
  91. printf(" 图书管理系统 \n");
  92. printf(" 0 退出系统 \n");
  93. printf(" 1 登记书籍 \n");
  94. printf(" 2 浏览书籍 \n");
  95. printf(" 3 借阅书籍 \n");
  96. printf(" 4 归还书籍 \n");
  97. printf(" 5 书籍排序 \n");
  98. printf(" 6 删除书籍 \n");
  99. printf(" 7 查找书籍 \n");
  100. printf("-------------------------\n");
  101. printf("\n--------请输入0-7--------\n");
  102. }
  103. //存文件操作
  104. void saveInfotoFile(const char* filename, struct Node* headNode)
  105. {
  106. FILE* pf = fopen(filename, "w");
  107. //存内容到文件。无非就是打印到文本文件
  108. struct Node* pMove = headNode->next;
  109. while (pMove != NULL)
  110. {
  111. //存操作
  112. fprintf(pf,"%s\t%s\t%s\t%f\t%d\n", pMove->data.book_num, pMove->data.book_name, pMove->data.book_write, pMove->data.privce, pMove->data.num);
  113. pMove = pMove->next;
  114. }
  115. fclose(pf);
  116. }
  117. //读文件操作
  118. void readInfofromFile(const char* filename, struct Node* headNode)
  119. {
  120. FILE* pf = fopen(filename, "r");
  121. if (pf == NULL)
  122. {
  123. pf = fopen(filename, "w+");
  124. }
  125. struct bookInfo tempdata;
  126. while (fscanf(pf,"%s\t%s\t%s\t%f\t%d\n", tempdata.book_num, tempdata.book_name, tempdata.book_write, &tempdata.privce, &tempdata.num)!=EOF)
  127. {
  128. insertNodeByHead(list, tempdata);
  129. }
  130. fclose(pf);
  131. }
  132. //价格排序
  133. void bubbleSortlist(struct Node* headNode)
  134. {
  135. for (struct Node* p = headNode->next; p != NULL; p = p->next)
  136. {
  137. for (struct Node* q = headNode->next; q->next != NULL; q = q->next)
  138. {
  139. if (q->data.privce > q->next->data.privce)
  140. {
  141. struct bookInfo temp = q->data;
  142. q->data = q->next->data;
  143. q->next->data = temp;
  144. }
  145. }
  146. }
  147. printlist(headNode);
  148. }
  149. void keyDown()
  150. {
  151. int input = 0;
  152. struct bookInfo tempbook;//临时存储书籍信息
  153. struct Node* Find_Book = NULL;//用来查找函数的接收
  154. scanf("%d", &input);
  155. switch (input)
  156. {
  157. case 0:
  158. printf("退出成功\n");
  159. exit(0);
  160. break;
  161. case 1:
  162. printf("【登记】\n");
  163. printf("请输入书籍的编号\n");
  164. scanf("%s", tempbook.book_num);
  165. printf("请输入书籍的书名\n");
  166. scanf("%s", tempbook.book_name);
  167. printf("请输入书籍的作者\n");
  168. scanf("%s", tempbook.book_write);
  169. printf("请输入书籍的价格\n");
  170. scanf("%f", &tempbook.privce);
  171. printf("请输入书籍的数量\n");
  172. scanf("%d", &tempbook.num);
  173. printf("\t登记成功\n");
  174. insertNodeByHead(list, tempbook);
  175. saveInfotoFile("boolinfo.txt", list);
  176. break;
  177. case 2:
  178. printf("【浏览】\n");
  179. printlist(list);
  180. break;
  181. case 3:
  182. printf("【借阅】\n");
  183. printf("请输入借阅的书名\n");
  184. scanf("%s", tempbook.book_name);
  185. Find_Book = FindName(list, tempbook.book_name);
  186. if (Find_Book == NULL)
  187. {
  188. printf("没有相关书籍,无法借阅\n");
  189. }
  190. else
  191. {
  192. if (Find_Book->data.num > 0)
  193. {
  194. Find_Book->data.num--;
  195. saveInfotoFile("boolinfo.txt", list);//同步到文本文件中去
  196. printf("借阅成功\n");
  197. }
  198. else
  199. {
  200. printf("当前书籍无库存,无法借阅\n");
  201. }
  202. }
  203. break;
  204. case 4:
  205. printf("【归还】\n");
  206. printf("请输入归还的书名\n");
  207. scanf("%s", tempbook.book_name);
  208. Find_Book = FindName(list, tempbook.book_name);
  209. if (Find_Book == NULL)
  210. {
  211. printf("非法操作,这书不是本书店\n");
  212. }
  213. else
  214. {
  215. Find_Book->data.num++;
  216. saveInfotoFile("boolinfo.txt", list);//同步到文本文件中去
  217. printf("书本归还成功\n");
  218. }
  219. break;
  220. case 5:
  221. printf("【排序】\n");
  222. bubbleSortlist(list);
  223. break;
  224. case 6:
  225. printf("【删除】\n");
  226. printf("请输入删除书本名字\n");
  227. scanf("%s", tempbook.book_name);
  228. Find_Book = FindName(list, tempbook.book_name);
  229. if (Find_Book == NULL)
  230. {
  231. printf("要删除的书籍不存在,删除失败\n");
  232. }
  233. else
  234. {
  235. deleteNodeByData(list, tempbook.book_name);
  236. //删除后要同步到文本文件
  237. saveInfotoFile("boolinfo.txt", list);
  238. printf("删除成功\n");
  239. }
  240. break;
  241. case 7:
  242. printf("【查找】\n");
  243. printf("请输入要查找的书本的名字\n");
  244. scanf("%s", tempbook.book_name);
  245. Find_Book = FindName(list, tempbook.book_name);
  246. if (Find_Book == NULL)
  247. {
  248. printf("查询不到这本书\n");
  249. }
  250. else
  251. {
  252. printf("编号 书名 作者 价格 数量\t\n");
  253. printf("%2s %6s %6s %5.1f %4d\n", Find_Book->data.book_num, Find_Book->data.book_name, Find_Book->data.book_write, Find_Book->data.privce, Find_Book->data.num);
  254. }
  255. default:
  256. printf("请输入0-7\n");
  257. break;
  258. }
  259. }
  260. int main()
  261. {
  262. list = createHead();
  263. readInfofromFile("boolinfo.txt", list);
  264. while (1)
  265. {
  266. makemenu();
  267. keyDown();
  268. system("pause");
  269. system("cls");
  270. }
  271. return 0;
  272. }

注意:如果第一次代码运行后CMD显示黑屏,可以先这样↓

  1. int main()
  2. {
  3. list = createHead();
  4. while (1)
  5. {
  6. makemenu();
  7. keyDown();
  8. system("pause");
  9. system("cls");
  10. }
  11. readInfofromFile("boolinfo.txt", list);
  12. return 0;
  13. }

把readInfofromFile("boolinfo.txt", list);放在while下面先,然后正常的添加书籍之后(即case 1:)后再把readInfofromFile("boolinfo.txt", list);放回到while循环上面;

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

闽ICP备14008679号