#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循环上面;