随着数据结构阶段的学习,小白也做出了自己的项目作品,现将其分享一下。
1、作品部分功能展示
身份选择
顾客浏览
顾客购买
管理员部分功能展示
其余的功能就不一一展示了,需要的伙计可以找我。
2、项目实现
1、商品的存储方式
定义一个商品结构体,将其存于链表节点中,再将每个节点采用Hash表链地址法储存
在此浅说一下我理解的链地址存储:
因为我们并不能确定具体会有多少商品要被存储,那么到底要开辟多大空间也会是个问题;
使用链地址操作就像是我确定好需要几层货架,到时候根据商品的编号把他们分类放到指定那层去;
如下是本作品所用的,在每次添加新商品时仅需将编号传给Hash函数以获取具体存放那层,然后就用链表的头插尾插方式皆可存储。
//定义商品数据类型
typedef struct goods
{
int serial; //商品编号
char name[20]; //商品名
float price; //商品价格
int stock; //库存量
char status[20]; //商品状态
}data_type;
//定义链表节点类型
typedef struct linkNode
{
data_type data;
struct linkNode *pNext;
}Link;
//定义Hash表的类型
typedef struct hash
{
Link *arr[N]; //货架
int count; //上架商品种类数
int lastSerial; //所有商品种类总数
float profit; //店铺盈利
}Hash;
2、部分相关功能函数
1.添加商品
/*
* 功能:添加新品
* 参数:
* @1:Hash表的首地址
* @2:所添加商品信息
* 返回值:成功返回OK,失败返回原因
*/
int Add_New_Goods(Hash *pHash,data_type item)
{
if(NULL == pHash)
{
return NULL_ERROR;
}
int pos = keyFunc(item.serial);
Link *pNew = (Link *)malloc(sizeof(Link));
if(NULL == pNew)
{
perror("malloc error");
return MALLOC_ERROR;
}
memset(pNew,0,sizeof(Link));
pNew->data = item;
pNew->pNext = pHash->arr[pos];
pHash->arr[pos] = pNew;
pHash->count++;
pHash->lastSerial++;
return OK;
}
2.查看商品信息
/*
* 功能:显示单个商品信息
* 参数:商品节点首地址
* 返回值:成功返回OK,失败返回原因
*/
int Show_Goods(Link *Goods)
{
if(NULL == Goods)
{
return NULL_ERROR;
}
printf("%d\t%s\t%.2f\t%d\t%s\n",Goods->data.serial,Goods->data.name, \
Goods->data.price,Goods->data.stock,Goods->data.status);
return OK;
}
/*
* 功能:显示所有商品信息
* 参数:Hash表的首地址
* 返回值:成功返回OK,失败返回原因
*/
int Show_All_Goods(Hash *pHash)
{
if(NULL == pHash)
{
return NULL_ERROR;
}
Link *pTemp = NULL;
int i;
for(i = 0; i < N;i++)
{
pTemp = pHash->arr[i];
while(pTemp != NULL)
{
Show_Goods(pTemp);
pTemp = pTemp->pNext;
}
}
return OK;
}
3.根据商品名称查找商品
/*
* 功能:查找商品
* 参数:
* @1:Hash表的首地址
* @2:要查找商品的名称
* 返回值:成功返回商品所在节点地址,失败返回NULL
*/
Link *Find_Goods(Hash *pHash,char *name)
{
if(NULL == pHash)
{
return NULL;
}
if(NULL == name)
{
return NULL;
}
Link *pTemp = NULL;
int i=0;
for(i = 0; i < N;i++)
{
pTemp = pHash->arr[i];
while(pTemp != NULL)
{
if(strcmp(pTemp->data.name,name) == 0)
{
return pTemp;
}
pTemp = pTemp->pNext;
}
}
return NULL;
}
4.文件保存与读取
/*
* 功能:保存所有信息至记录文件
* 参数:Hash表的首地址
* 返回值:成功返回OK,失败返回原因
*/
int Save_Message(Hash *pHash)
{
if(NULL == pHash)
{
return NULL_ERROR;
}
int fw = open("profit.txt",O_WRONLY | O_CREAT,0664);
int fd = open("goods_list.txt",O_WRONLY | O_CREAT,0664);
if(fd < 0)
{
perror("open error");
return FILE_ERROR;
}
Link *pTemp = NULL;
int i;
for(i = 0;i < N;i++)
{
pTemp = pHash->arr[i];
while(pTemp != NULL)
{
if(write(fd,&pTemp->data,sizeof(data_type)) < 0)
{
break;
}
pTemp = pTemp->pNext;
}
}
write(fw,&pHash->profit,sizeof(float));
close(fw);
close(fd);
return OK;
}
/*
* 功能:导入文件清单
* 参数:Hash表的首地址
* 返回值:成功返回OK,失败返回原因
*/
int Load_Message(Hash *pHash)
{
if(NULL == pHash)
{
return NULL_ERROR;
}
int fr = open("profit.txt",O_RDONLY | O_CREAT,0664);
int fd = open("goods_list.txt",O_RDONLY | O_CREAT,0664);
if(fd < 0)
{
perror("open error");
return FILE_ERROR;
}
data_type item;
while(1)
{
if(read(fd,&item,sizeof(data_type)) == 0)
{
break;
}
Add_New_Goods(pHash,item);
}
float profit;
if(read(fr,&profit,sizeof(float)) < 0)
{
return FILE_ERROR;
}
pHash->profit = profit;
close(fd);
close(fr);
return OK;
}
分享至此,需要源码的伙伴可以私信。