简介:在刚学习完数据结构后,自己按想法做的一个书店管理系统,使用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;
}