初试C语言编程——简单的书店管理

这是一个使用I/O接口和链式数据存储实现的自制图书管理系统。程序包括图书信息的录入、删除、修改、查找、出售、显示和清理等功能。通过读取文件数据创建链表,并提供了对链表的操作。系统支持对图书的多种操作,具有一定的实用性和学习价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介:在刚学习完数据结构后,自己按想法做的一个书店管理系统,使用I\O接口操作以及链式数据存储。

自定义头文件

#ifndef _FUN_H
#define _FUN_H

//头文件
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

//宏定义
#define N 30


//结构体定义

//图书管理内容
typedef struct Library
{
	int ID;
	char Category[N];  //类别
	char Name[N];	//书名
	int Volume;		//进货量
	int Stock; 		//库存
 	double Price;     //单价
}data_type;

//单向链表
typedef struct Link
{
	data_type data;
	struct Link *pNext;

}LinkNode;
//枚举
enum Error
{
	MALLOC_ERROR=-6,
	CREAT_ERROR,
	ID_ERROR,
	Empty_ERROR,
	NULL_ERROR,
	ERROR,
	OK,
};


//自定义函数
void Menu();
LinkNode *CreatSpace();
int BookInformationEntry(LinkNode *pLibNode,int ID,data_type NewBook); //图书信息录入
int BookInformationDelete(LinkNode *pLibNode,int ID); //图书信息删除
int BookInformationModify(LinkNode *pLibNode,char NAME[N]); //图书信息修改
int BookInformationFind(LinkNode *pLibNode,char NAME[N]);   //查找图书信息
int BookInformationSell(LinkNode *pLibNode,char NAME[N]);  //出售图书信息
int BookInformationShow(LinkNode *pLibNode);  //打印图书信息
int BookInformationClear(LinkNode *pLibNode); //清理图书信息

#endif

主函数

#include "../include/fun.h"

int main(int argc ,const char *argv[])
{		
	data_type Newdata;
	Menu();
	LinkNode *pHead = NULL;
	int op,ID ,ret;
	char NAME[N];
	pHead = CreatSpace();
	if(NULL ==pHead)
	{
		printf("CREAT ERRORE!");
		return CREAT_ERROR;
	}
	printf("创建头结点成功\n");
	int fr = open("Library.txt",O_RDWR);
	if(0>fr)
	{
		perror("open error");
	}
	else
	{
		printf("打开信息成功\n");
		while(1)
		{	
			int Read = read(fr,&Newdata,sizeof(Newdata));
			if(0>Read)
			{
				printf("导入失败!\n");
				BookInformationClear(pHead);
				break;
			}
			else if(0<Read)
			{
				while(NULL ==pHead->pNext)
				{
					LinkNode *pNewdata=(LinkNode *)malloc(sizeof(pNewdata->data));	
					if(NULL == pHead->pNext)
					{
						pNewdata->data = Newdata;
						pHead->pNext =pNewdata;
						pNewdata=pNewdata->pNext;
					}
					else
					{
						while(NULL !=pHead->pNext)
						{
							pNewdata->data = Newdata;
							pHead->pNext = pNewdata;
							pNewdata =pNewdata->pNext;
						}
					}
				}
			}
			else
			{
				printf("导入成功!\n");
				break;
			}
		}
	}

	while(1)
	{
		printf("请输入您的操作选项\n");
		scanf("%d",&op);	
		if(0 == op)
		{	
			LinkNode *pTemp =  pHead->pNext;
			while(NULL !=pTemp)
			{
				lseek(fr,0,SEEK_SET);
				int fw = write(fr,&pTemp->data,sizeof(pTemp->data));
				if(0>fw)
				{
					printf("write error!\n");
					close(fr);
					close(fw);
					BookInformationClear(pHead);
					return ERROR;
				}
				else if(0 == fw)
				{
					printf("无内容写入!\n");
					close(fr);
					close(fw);
					BookInformationClear(pHead);
					return ERROR;
				}
				else
				{
					printf("写入成功,写入的字符数%d\n",fw);
				}
				pTemp =pTemp->pNext;
			}
			BookInformationClear(pHead);
			close(fr);
			printf("退出图书管理系统成功\n");
			printf("欢迎下次使用\n");
			break;
		}
		switch(op)
		{
		case 1:
			printf("请输入ID\n");
			scanf("%d",&ID);
			BookInformationEntry(pHead,ID,Newdata);
			if(0 == ID)
			{
				printf("退出添加\n");
				break;
			}	
			break;
		case 2:
			printf("请输入想要删除的序号\n");
			scanf("%d",&ID);
			if(0 == ID)
			{
				printf("退出删除\n");
				break;
			}
			BookInformationDelete(pHead,ID);
			break;
		case 3:
			printf("请输入修改信息的书名\n");
			scanf("%s",NAME);				
			BookInformationModify(pHead,NAME);
			break;
		case 4:
			printf("请输入需要查找的书名\n");
			scanf("%s",NAME);
			BookInformationFind(pHead,NAME);
			break;
		case 5:
			printf("请输入出售的书名\n");
			scanf("%s",NAME);
			ret =BookInformationSell(pHead,NAME);
			if(0 == ret)
			{
				printf("出售成功\n");
			}
			break;
		case 6:
			BookInformationShow(pHead);
			break;
		case 7:
			ret =BookInformationClear(pHead);
			if(0 == ret)
			{
				printf("清理成功\n");
			}
			break;
		default:
			printf("选项输入错误,请重新输入\n");
		}
	}
	return 0;
}

子程序:

#include "../include/fun.h"

void Menu()
{	
	printf("************************\n");
	printf("欢迎使用稚栀图书管理系统\n");
	printf("------制作人:稚栀-----\n");
	printf("--制作单位:嵌入式22071--\n");	
	printf("1-----------添加图书信息\n");
	printf("2-----------删除图书信息\n");
	printf("3-----------修改图书信息\n");
	printf("4-----------查找图书信息\n");
	printf("5-----------出售图书信息\n");
	printf("6-----------显示图书信息\n");
	printf("7-----------清理图书信息\n");
	printf("0-----------退出管理系统\n");
	printf("************************\n");
}

//空间申请
LinkNode *CreatSpace()
{
	LinkNode *pLibNode =NULL;
	pLibNode =(LinkNode *)malloc(sizeof(LinkNode));
	if(NULL == pLibNode)
	{
		printf("MALLOC Error!\n");
		return NULL;
	}
	//重置空间
	memset(pLibNode,'\0',sizeof(LinkNode));
	return pLibNode;
}

//添加图书信息
int BookInformationEntry(LinkNode *pLibNode,int ID,data_type NewBook)
{	
	//创建头结点
	//判断输入的序号
	printf("请输入需要添加的图书信息\n");
	printf("请输入添加的图书类别\n");
	scanf("%s",NewBook.Category);
	printf("请输入图书名\n");
	scanf("%s",NewBook.Name);
	printf("请输入进货量\n");
	scanf("%d",&NewBook.Volume);
	NewBook.Stock = NewBook.Volume;
	printf("请输入单价\n");
	scanf("%lf",&NewBook.Price);
	NewBook.ID = ID;
	if(NULL == pLibNode)
	{
		printf("NULL ERRORE\n");
		return NULL_ERROR;
	}

	//新数据的结点
	LinkNode *pNew =CreatSpace();
	pNew->data = NewBook;
	if(NULL == pNew)
	{
		return MALLOC_ERROR;
	}
	//中间插入
	//寻找ID-1的位置
	LinkNode *pPre = pLibNode;
	if(NULL == pPre->pNext)
	{
		pPre->pNext = pNew;
	}
	else
	{
		int i ;
		for(i=0;(i<ID-1)&&(NULL !=pPre);i++)
		{
			pPre =pPre->pNext;
		}
		if(NULL ==pPre)
		{
			printf("ID is ERRORE");
			return ID_ERROR;
		}
		else
		{
			pNew->pNext = pPre->pNext;
			pPre->pNext = pNew;
		}
	}

	printf("添加完毕!\n");	
	return OK;
}

int BookInformationDelete(LinkNode *pLibNode,int ID)
{
	int i;
	data_type DelData;
	if(NULL == pLibNode)
	{
		printf("Creat is error!\n");
		return CREAT_ERROR;
	}
	if(ID <0)
	{
		printf("ID is error");
		return ID_ERROR;
	}
	LinkNode *pDelPre = pLibNode;
	if(NULL == pDelPre->pNext)
	{
		printf("无图书信息,无法删除!\n");
		return Empty_ERROR;
	}
	else
	{
		for(i= 0;(i<ID -1)&&(NULL !=pDelPre);i++)
		{
			pDelPre =pDelPre->pNext;
		}
		if(NULL == pDelPre)
		{
			printf("ID is error!\n");
			return ID_ERROR;
		}
		LinkNode *pDel = pDelPre->pNext;
		pDelPre->pNext=pDel->pNext;
		DelData = pDel->data;
		//释放
		printf("删除图书成功,删除的图书为%s\n",DelData.Name);
		free(pDel);
		pDel= NULL;

	}
	return OK;
}
int BookInformationModify(LinkNode *pLibNode,char NAME[N])
{
	int Newprice,NewVolume;
	LinkNode *palter = pLibNode;
	if(NULL == palter)
	{
		printf("Creat is error!\n");
		return CREAT_ERROR;
	}
	while(NAME != palter->data.Name||NULL!= palter->pNext)
		{
			palter =palter->pNext;
			if( 0 == strcmp(palter->data.Name,NAME))
			{
				LinkNode *ppAlter = palter;
				printf("请输入修改的单价\n");
				scanf("%d",&Newprice);
				ppAlter->data.Price = Newprice;
				printf("请修改进货量\n");
				scanf("%d",&NewVolume);
				ppAlter->data.Volume = NewVolume;
				ppAlter->data.Stock = NewVolume;
				break;
			}
			else
			{
			printf("无此书\n");
			break;
			}
		}
	return 0;
}

int BookInformationFind(LinkNode *pLibNode,char NAME[N])
{
	LinkNode *pFound= pLibNode;
	if(NULL == pFound)
	{
		printf("Creat is error!\n");
		return CREAT_ERROR;
	}
	while(NAME != pFound->data.Name||NULL!= pFound->pNext)	
	{
		pFound = pFound->pNext;
		if(0 == strcmp(pFound->data.Name,NAME))
		{
			printf("%d\n",pFound->data.ID);
			printf("Category:%s\n",pFound->data.Category);
			printf("Name:%s\n",pFound->data.Name);
			printf("Volume:%d\n",pFound->data.Volume);
			printf("Stock:%d\n",pFound->data.Stock);
			printf("Price:%.2lf\n",pFound->data.Price);
			break;
		}
		else
		{
			printf("无此书\n");
			break;
		}
	
	}
	return 0;
}

int BookInformationSell(LinkNode *pLibNode,char NAME[N])
{	
	int initial;
	LinkNode *pSale = pLibNode;
	if(NULL == pSale)
	{
		printf("Creat is error!\n");
		return CREAT_ERROR;
	}
	while(NAME!= pSale->data.Name||NULL != pSale->pNext)
	{
		if(0 == strcmp(pSale->data.Name,NAME))
		{
			initial =pSale->data.Stock;
			pSale->data.Stock = pSale->data.Stock-1;
			break;
		}
		else
		{
			printf("无此书\n");
			break;
		}
	}
	printf("原库存%d\n",initial);
	printf("现库存%d\n",pSale->data.Stock);
	return 0;
}


int BookInformationShow(LinkNode *pLibNode)
{
	if(NULL == pLibNode)
	{
		printf("Creat link error!\n");
		return CREAT_ERROR;
	}
	//显示每一个结点的数值
	LinkNode *pShow = pLibNode->pNext;
	if(NULL == pShow)
	{
		printf("链表为空,无显示内容!\n");
		return Empty_ERROR;
	}
	else
	{
		while(NULL !=pShow)
		{
			printf("********************\n");
			printf("%d\n",pShow->data.ID);
			printf("Category:%s\n",pShow->data.Category);
			printf("Name:%s\n",pShow->data.Name);
			printf("Volume:%d\n",pShow->data.Volume);
			printf("Stock:%d\n",pShow->data.Stock);
			printf("Price:%.2lf\n",pShow->data.Price);
			printf("***********************");
			pShow = pShow->pNext;
		}
		printf("\n");
		printf("显示完成\n");
	}
	return 0;
}
int BookInformationClear(LinkNode *pLibNode)
{
	if(NULL == pLibNode)
	{
		printf("Creat is error!\n");
		return CREAT_ERROR;
	}
	if(NULL == pLibNode->pNext)
	{
		free(pLibNode);
		pLibNode=NULL;
	}
	else
	{
		LinkNode *pCNode = pLibNode->pNext;
		LinkNode *pCTemp = NULL;
		while(NULL !=pCNode)
		{
			pCTemp =pCNode;
			pCNode = pCNode->pNext;
			free(pCTemp);
			pCTemp = NULL;
		}
	}

	return 0;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值