经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
C++利用链表实现图书信息管理系统
来源:jb51  时间:2021/11/22 18:46:05  对本文有异议

C++利用链表实现一个简单的图书信息管理系统,供大家参考,具体内容如下

(1)图书信息包括ISBN号、书名、作者名、价格和数量等;
(2)系统的主要功能包括:图书信息的创建、输出图书信息、查询图书信息、增加图书信息、删除图书信息。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. //创建结构体及其成员
  6. typedef struct Node {
  7. int num;//编号
  8. char name[20];//书名
  9. char author[20];//作者
  10. int isexsit;//数量
  11. float price;//价格
  12. struct Node *next;//指针域
  13. } S;//结构体定义为S
  14. //各函数定义
  15. void choose();
  16.  
  17. void menu(); //菜单函数
  18. S *create();//创建链表函数
  19. void print(S *);//输出链表函数
  20. void pop_sort(S *);//排序
  21. void insert(S *);//插入节点函数
  22. void del(S *);//删除节点函数
  23. void search1(S *);//书名查找节点函数
  24. void search2(S *);//作者查找节点函数
  25. void search3(S *);//编号查找
  26. void mod(S *);//修改图书信息
  27. //主函数
  28. int main() {
  29. choose();
  30. }
  31.  
  32. void choose() {
  33. S *head;
  34. int n, a = 1;//n用来控制选择操作类型,a控制循环,以-1终止
  35. while (a > 0) {
  36. menu();//显示菜单
  37. printf("选择你想使用的功能:");
  38. scanf("%d", &n);//选择操作
  39. switch (n)//各操作数字对应菜单数字,通过n确定操作类型
  40. {
  41. case 1://创建
  42. head = create();
  43. break;
  44. case 2://输出
  45. printf("图书信息为(按价格排序后)\n");
  46. pop_sort(head);
  47. printf("编号\t书名\t作者\t数量\t价格\n");
  48. print(head);
  49. break;
  50. case 3://插入
  51. insert(head);
  52. printf("插入后\n");
  53. printf("编号\t书名\t作者\t数量\t价格\n");
  54. print(head);
  55. break;
  56. case 4://删除
  57. del(head);
  58. printf("删除后\n");
  59. printf("编号\t书名\t作者\t数量\t价格\n");
  60. print(head);
  61. break;
  62. case 5://书名查找
  63. search1(head);
  64. break;
  65. case 6://作者查找
  66. search2(head);
  67. break;
  68. case 7://编号查找
  69. search3(head);
  70. break;
  71. case 8://修改
  72. mod(head);
  73. pop_sort(head);
  74. printf("图书信息为\n");
  75. printf("编号\t书名\t作者\t数量\t价格\n");
  76. print(head);
  77. break;
  78. default:
  79. a = -1;//跳出循环条件
  80. break;
  81. }
  82. }
  83. }
  84.  
  85. //菜单模块直接显示
  86. void menu() {
  87. printf("\n\n");
  88. printf("\t\t 欢迎使用图书管理系统\n");
  89. printf("\t\t|----------SCORE-----------|\n");
  90. printf("\t\t|\t1.创建图书 |\n");
  91. printf("\t\t|\t2.展示图书信息 |\n");
  92. printf("\t\t|\t3.添加图书信息 |\n");
  93. printf("\t\t|\t4.删除图书 |\n");
  94. printf("\t\t|\t5.按图书名搜索 |\n");
  95. printf("\t\t|\t6.按作者名搜索 |\n");
  96. printf("\t\t|\t7.按图书编号搜索 |\n");
  97. printf("\t\t|\t8.修改图书信息 |\n");
  98. printf("\t\t|\t9.退出程序 |\n");
  99. printf("\t\t|--------------------------|\n");
  100. printf("\t\t\tchoice(1-9):\n");
  101. }
  102.  
  103. //创建链表模块
  104. S *create() {
  105. S *head, *p, *q;//定义指针
  106. int i;
  107. head = (S *) malloc(sizeof(S));//头节点开辟空间
  108. head->next = NULL;//置空头节点的指针域
  109. q = head;//q指针记录头节点的地址
  110. p = head->next;//p指针记录头节点的指针域的地址
  111. printf("请输入图书编号,图书名,作者,图书数量,价格,最后输入0结束\n");
  112. int num;
  113. scanf("%d", &num);
  114. while (num != 0)//输入书籍编号输入为零停止循环
  115. {
  116. p = (S *) malloc(sizeof(S));//p指针开辟空间
  117. //输入各成员
  118. p->num = num;
  119. scanf("%s %s %d %f", p->name, p->author, &p->isexsit, &p->price);
  120. p->next = NULL;//置空p节点的指针域
  121. q->next = p;//p,q节点连接
  122. q = p;//q指针后移
  123. printf("请输入图书编号,图书名,作者,图书数量,价格,最后输入0结束\n");
  124. scanf("%d", &num);
  125. }
  126. return head;//返回链表的起始地址
  127. }
  128.  
  129. //插入节点模块(可多个插入)
  130. void insert(S *head) {
  131. int i, num, flag = 1;//flag实现判断指针是否到达最后一个节点
  132. S *p, *q, *r; //定义指针便于插入操作
  133. printf("请输入一本图书的信息:\n");
  134. printf("请输入图书的编号,输入0结束\n");
  135. scanf("%d", &num);
  136. while (num != 0)//输入编号不为零时循环,以零终止,可实现多个插入
  137. {
  138. r = (S *) malloc(sizeof(S));//为r开辟空间
  139. r->next = NULL;//置空r的指针域
  140. r->num = num;
  141. printf("请输入图书名,作者,图书数量,图书价格\n");
  142. scanf("%s %s %d %f", r->name, r->author, &r->isexsit, &r->price);
  143. q = head;//q指针记录头节点的地址
  144. p = head->next;//p指针记录头节点的指针域的地址
  145. while (q->next != NULL && p->price < r->price)//循环条件:当q->next不为空,以及按价格排序插入
  146. {
  147. p = p->next;//p指针后移
  148. q = q->next;//q指针后移
  149. if (q->next == NULL)//这个判断防止q->next为空时,在执行循环是出现野指针使程序出错
  150. {
  151. p = NULL;//防止出现野指针p
  152. q->next = r;//连接节点
  153. r->next = NULL;//置空r指针域
  154. flag = 0;//到达最后一个节点更改flag
  155. break;
  156. }
  157. }
  158. if (flag)//判断是否到达最后一个节点,为真执行该操作
  159. {
  160. r->next = p;
  161. q->next = r;
  162. //实现将r节点插入链表
  163. }
  164. printf("请输入图书编号,输入0结束\n");
  165. scanf("%d", &num);
  166. }
  167. }
  168.  
  169. //删除节点模块
  170. void del(S *head) {
  171. S *p, *q;//定义指针
  172. int b;//用于输入编号查找删除
  173. p = head;//p记录头节点的地址
  174. q = head->next;//q记录头节点的指针域的地址
  175. printf("请输入你想要删除的图书编号:");
  176. //输入编号
  177. scanf("%d", &b);
  178. while (q != NULL)//q不为空时执行循环
  179. {
  180. if (q->num == b)//判断是否找到输入的编号
  181. //为真时
  182. {
  183. p->next = q->next;//断开q节点
  184. free(q);//释放q节点neicun
  185. q = NULL; //置空q指针防止出现野指针
  186. } else {
  187. //判断为假时
  188. p = p->next;//p指针后移
  189. q = q->next;//q指针后移
  190. }
  191. }
  192. if (p == NULL)//当查找到最后一个节点还未查到要删除的编号时,输出输入错误
  193. printf("输入错误\n");
  194. }
  195.  
  196. //书名查找模块
  197. void search1(S *head) {
  198. S *p;//定义指针
  199. char name1[20];//定义name1用于输入查找书名
  200. printf("请输入你要搜素的书名:");
  201. //输入查找书名
  202. scanf("%s", name1);
  203. p = head->next;
  204. while (p != NULL) {
  205. if (strcmp(p->name, name1) == 0)//判断是否找到书籍
  206. {
  207. //为真时,输出信息
  208. printf("书籍信息\n");
  209. printf("编号\t书名\t作者\t数量\t价格\n");
  210. printf("%d\t%s\t%s\t%d\t%.2f\n", p->num, p->name, p->author, p->isexsit, p->price);
  211. break;
  212. } else
  213. //为假时
  214. p = p->next;//指针后移
  215. }
  216. if (p == NULL)//查找到最后一个节点还未查到要的编号时,输出输入错误
  217. printf("输入错误\n");
  218. }
  219.  
  220. //作者查找模块
  221. void search2(S *head) {
  222. S *p;//定义指针
  223. char name2[20];//定义name2用于输入查找书籍
  224. printf("输入你想要查询的作者:");
  225. //输入查找作者
  226. scanf("%s", name2);
  227. p = head->next;
  228. while (p != NULL) {
  229. if (strcmp(p->author, name2) == 0)//判断是否找到书籍
  230. {
  231. //为真时,输出信息
  232. printf("书籍信息\n");
  233. printf("编号\t书名\t作者\t数量\t价格\n");
  234. printf("%d\t%s\t%s\t%d\t%.2f\n", p->num, p->name, p->author, p->isexsit, p->price);
  235. break;
  236. } else
  237. //为假时
  238. p = p->next;//指针后移
  239. }
  240. if (p == NULL)//查找到最后一个节点还未查到要的编号时,输出输入错误
  241. printf("输入错误\n");
  242. }
  243.  
  244. //编号查找
  245. void search3(S *head) {
  246. S *p;//定义指针
  247. int num1;//定义num1用于输入查找书籍
  248. printf("请输入你要搜索的图书编号:");
  249. //输入查找编号
  250. scanf("%d", &num1);
  251. p = head->next;
  252. while (p != NULL) {
  253. if (p->num == num1)//判断是否找到书籍
  254. {
  255. //为真时,输出信息
  256. printf("书籍信息\n");
  257. printf("编号\t书名\t作者\t数量\t价格\n");
  258. printf("%d\t%s\t%s\t%d\t%.2f\n", p->num, p->name, p->author, p->isexsit, p->price);
  259. break;
  260. } else
  261. //为假时
  262. p = p->next;//指针后移
  263. }
  264. if (p == NULL)//查找到最后一个节点还未查到要的编号时,输出ERROR INPUT
  265. printf("输入错误\n");
  266. }
  267.  
  268. //修改信息模块
  269. void mod(S *head) {
  270. S *p;//定义指针
  271. int num1, num2, isexsit1;//定义num1用于输入查找书籍修改信息,num2用于修改
  272. char name1[20], author1[20];
  273. float price1;
  274. printf("请输入你要修改的图书编号:");
  275. //输入要修改的图书编号
  276. scanf("%d", &num1);
  277. p = head->next;
  278. while (p != NULL) {
  279. if (p->num == num1)//判断是否找到书籍
  280. {
  281. printf("请再次输入 图书编号,书名,作者,图书数量 ,价格\n");
  282. //为真时,重输图书信息
  283. scanf("%d %s %s %d %f", &num2, name1, author1, &isexsit1, &price1);
  284. p->num = num2;
  285. strcpy(p->name, name1);
  286. strcpy(p->author, author1);
  287. p->isexsit = isexsit1;
  288. p->price = price1;
  289. break;
  290. } else
  291. //为假时
  292. p = p->next;//指针后移
  293. }
  294. if (p == NULL)//查找到最后一个节点还未查到要的编号时,输出输入错误
  295. printf("输入错误\n");
  296. }
  297.  
  298. void pop_sort(S *head) //链表冒泡排序
  299. {
  300. //排序中没有修改头节点指针值,只是修改指针内容head->next的值
  301. S *pre, *p, *tail, *temp;
  302. tail = NULL;
  303. pre = head;
  304. while ((head->next->next) != tail)//(head->next)!=tail同样适用 ,多执行最后一个步比较
  305. {
  306. p = head->next;
  307. pre = head;
  308. while (p->next != tail) {
  309. if ((p->price) > (p->next->price)) {
  310. pre->next = p->next; //交换节点方法
  311. temp = p->next->next;
  312. p->next->next = p;
  313. p->next = temp;
  314. p = pre->next; //p回退一个节点
  315. }
  316. p = p->next; //p再前进一个节点
  317. pre = pre->next;
  318. }
  319. tail = p;
  320. }
  321. }
  322.  
  323. //输出链表模块
  324. void print(S *head) {
  325. int i;
  326. S *p = head->next;
  327. while (p)//当p不为空的时候执行
  328. {
  329. printf("%d\t%s\t%s\t%d\t%.2f\n", p->num, p->name, p->author, p->isexsit, p->price);
  330. printf("\n");
  331. p = p->next;//指针后移
  332. }
  333. }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号