数据结构图书管理系统

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值