赞
踩
- #define _CRT_SECURE_NO_WARNINGS 1
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- //图书的结构体
- struct bookInfo
- {
- char book_num[10];//编号
- char book_name[20];//书名
- char book_write[20];//作者
- float privce;//价格
- 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 printlist(struct Node* headNode)
- {
- struct Node* pMove = headNode->next;
- printf("编号 书名 作者 价格 数量\t\n");
- while (pMove)
- {
- 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);
- pMove = pMove->next;
- }
- }
- //插入节点(头插)
- void insertNodeByHead(struct Node* headNode, struct bookInfo data)
- {
- //动态申请节点空间
- struct Node* newnode = createNode(data);
- newnode->next = headNode->next;
- headNode->next = newnode;
- }
- //删除 使用书籍名称进行删除
- void deleteNodeByData(struct Node* headNode, char* book_name)
- {
- struct Node* posLeftNode = headNode;
- struct Node* posNode = headNode->next;
- while (posNode != NULL && strcmp(posNode->data.book_name,book_name))//!=0
- {
- posLeftNode = posNode;
- posNode = posNode->next;
- }
- if (posNode == NULL)
- {
- return;
- }
- else
- {
- posLeftNode->next = posNode->next;
- free(posNode);
- posNode = NULL;
- }
- }
- //查找
- struct Node* FindName(struct Node* headNode, char* book_name)
- {
- struct Node* find = headNode->next;
- while (find!= NULL && strcmp(find->data.book_name,book_name))//!=0
- {
- find = find->next;
- }
- return find;
- }
- void makemenu()
- {
- printf("-------------------------\n");
- printf(" 图书管理系统 \n");
- printf(" 0 退出系统 \n");
- printf(" 1 登记书籍 \n");
- printf(" 2 浏览书籍 \n");
- printf(" 3 借阅书籍 \n");
- printf(" 4 归还书籍 \n");
- printf(" 5 书籍排序 \n");
- printf(" 6 删除书籍 \n");
- printf(" 7 查找书籍 \n");
- printf("-------------------------\n");
- printf("\n--------请输入0-7--------\n");
- }
- //存文件操作
- void saveInfotoFile(const char* filename, struct Node* headNode)
- {
- FILE* pf = fopen(filename, "w");
- //存内容到文件。无非就是打印到文本文件
- struct Node* pMove = headNode->next;
- while (pMove != NULL)
- {
- //存操作
- 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);
- pMove = pMove->next;
- }
- fclose(pf);
- }
- //读文件操作
- void readInfofromFile(const char* filename, struct Node* headNode)
- {
- FILE* pf = fopen(filename, "r");
- if (pf == NULL)
- {
- pf = fopen(filename, "w+");
- }
- struct bookInfo tempdata;
- 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)
- {
- insertNodeByHead(list, tempdata);
- }
- fclose(pf);
- }
- //价格排序
- 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.privce > q->next->data.privce)
- {
- struct bookInfo temp = q->data;
- q->data = q->next->data;
- q->next->data = temp;
- }
- }
- }
- printlist(headNode);
- }
- void keyDown()
- {
- int input = 0;
- struct bookInfo tempbook;//临时存储书籍信息
- struct Node* Find_Book = NULL;//用来查找函数的接收
- scanf("%d", &input);
- switch (input)
- {
- case 0:
- printf("退出成功\n");
- exit(0);
- break;
- case 1:
- printf("【登记】\n");
- printf("请输入书籍的编号\n");
- scanf("%s", tempbook.book_num);
- printf("请输入书籍的书名\n");
- scanf("%s", tempbook.book_name);
- printf("请输入书籍的作者\n");
- scanf("%s", tempbook.book_write);
- printf("请输入书籍的价格\n");
- scanf("%f", &tempbook.privce);
- printf("请输入书籍的数量\n");
- scanf("%d", &tempbook.num);
- printf("\t登记成功\n");
- insertNodeByHead(list, tempbook);
- saveInfotoFile("boolinfo.txt", list);
- break;
- case 2:
- printf("【浏览】\n");
- printlist(list);
- break;
- case 3:
- printf("【借阅】\n");
- printf("请输入借阅的书名\n");
- scanf("%s", tempbook.book_name);
- Find_Book = FindName(list, tempbook.book_name);
- if (Find_Book == NULL)
- {
- printf("没有相关书籍,无法借阅\n");
- }
- else
- {
- if (Find_Book->data.num > 0)
- {
- Find_Book->data.num--;
- saveInfotoFile("boolinfo.txt", list);//同步到文本文件中去
- printf("借阅成功\n");
- }
- else
- {
- printf("当前书籍无库存,无法借阅\n");
- }
- }
- break;
- case 4:
- printf("【归还】\n");
- printf("请输入归还的书名\n");
- scanf("%s", tempbook.book_name);
- Find_Book = FindName(list, tempbook.book_name);
- if (Find_Book == NULL)
- {
- printf("非法操作,这书不是本书店\n");
- }
- else
- {
- Find_Book->data.num++;
- saveInfotoFile("boolinfo.txt", list);//同步到文本文件中去
- printf("书本归还成功\n");
- }
- break;
- case 5:
- printf("【排序】\n");
- bubbleSortlist(list);
- break;
- case 6:
- printf("【删除】\n");
- printf("请输入删除书本名字\n");
- scanf("%s", tempbook.book_name);
- Find_Book = FindName(list, tempbook.book_name);
- if (Find_Book == NULL)
- {
- printf("要删除的书籍不存在,删除失败\n");
- }
- else
- {
- deleteNodeByData(list, tempbook.book_name);
- //删除后要同步到文本文件
- saveInfotoFile("boolinfo.txt", list);
- printf("删除成功\n");
- }
- break;
- case 7:
- printf("【查找】\n");
- printf("请输入要查找的书本的名字\n");
- scanf("%s", tempbook.book_name);
- Find_Book = FindName(list, tempbook.book_name);
- if (Find_Book == NULL)
- {
- printf("查询不到这本书\n");
- }
- else
- {
- printf("编号 书名 作者 价格 数量\t\n");
- 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);
-
- }
- default:
- printf("请输入0-7\n");
- break;
- }
- }
- int main()
- {
- list = createHead();
- readInfofromFile("boolinfo.txt", list);
- while (1)
- {
- makemenu();
- keyDown();
- system("pause");
- system("cls");
- }
- return 0;
- }

注意:如果第一次代码运行后CMD显示黑屏,可以先这样↓
- int main()
- {
- list = createHead();
- while (1)
- {
- makemenu();
- keyDown();
- system("pause");
- system("cls");
- }
- readInfofromFile("boolinfo.txt", list);
- return 0;
- }
把readInfofromFile("boolinfo.txt", list);放在while下面先,然后正常的添加书籍之后(即case 1:)后再把readInfofromFile("boolinfo.txt", list);放回到while循环上面;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。