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