关于虚拟货架的实现

                                                                                                 ------ 菜鸟经验分享

        作为刚学习完c语言、io操作、以及数据结构的初级菜鸟来说,最好的复习方式莫过于将所学的知识结合起来做一个实现某种特定功能的小程序(可能只能算程序的一小丢丢),所以龙猿版的虚拟货架产生了。

        大体功能:运行这个案例,可以实现基本的一些功能,例:上架商品、下架商品、修改商品信息、查看商品信息等。

    各功能子函数如图

1、上架商品子函数

int AddCommodityMessageToHash(Hash *pHash, data_type NewCommodityData)
{
	if(NULL == pHash)
	{
		return CREAT_ERROR;
	}

	//哈西函数 ---》 H(ID) =  ID  - 1
	int Index = NewCommodityData.ID - 1;

	HashNode *pNew = (HashNode *)malloc(sizeof(HashNode));
	if(NULL == pNew)
	{
		return MALLOC_ERROR;
	}
	memset(pNew, 0, sizeof(HashNode));

	//完成数据的赋值
	pNew->data = NewCommodityData;
	//保存结点的地址(头插)
	pNew->pNext = pHash->HashArr[Index];
	//将pNew重新赋值给HashArr[Index]
	pHash->HashArr[Index] = pNew;
	//更新商品的数量
	pHash->count++;
	return OK;
}

2、下架商品子函数

int Sort_outCommodityFromHash(Hash *pHash, int ID, data_type *pSort_outData)
{
	if(NULL == pHash)
	{
		return CREAT_ERROR;
	}
	if(ID <= 0 || ID > SIZE)
	{
		printf("ID 不合法!!!\n");
		return ID_ERROR;
	}
	if(NULL == pSort_outData)
	{
		return NULL_ERROR;
	}
	//思想:
	//(1)通过ID 找商品
	//(2)保存下架商品的信息
	//(3)释放即将下架商品的结点空间
	//(4)置空
	
	int Index = ID - 1;

	HashNode *pTemp = pHash->HashArr[Index];
	if(NULL == pTemp)
	{
		printf("该位置没有任何商品的信息被保存!\n");
		return EMPTY_ERROR;
	}
	else
	{
		//先判断pTemp->data.ID 是否等于 传入的ID
		if(ID == pTemp->data.ID)
		{
			//认为直接找到--->删除(下架该商品)
			//保存下架商品的的信息
			*pSort_outData = pTemp->data;
			//保存pTemp->pNext到pHash->HashArr[Index]
			pHash->HashArr[Index] = pTemp->pNext;
			free(pTemp);
			pTemp = NULL;
			//商品个数自减
			pHash->count--;
		}
		else
		{
			HashNode *pPre = pTemp;
			//定义结点指针指向第二个结点,因为第一个结点已经判断过不是
			//想要的结点
			HashNode *pDel = pPre->pNext;
			//遍历--》寻找下架商品信息所在结点
			while(NULL != pDel)
			{
				//存在结点,但是需要判断是否为指定的ID 
				if(ID == pDel->data.ID)
				{
					//保存下架商品的的信息
					*pSort_outData = pDel->data;
					//保存下架商品的后续结点的地址到前一个结点的指针域
					 pPre->pNext = pDel->pNext;
					 //释放即将下架商品的结点空间
					 free(pDel);
					 pDel = NULL;
					 pHash->count--;
				}
				else
				{
					//进入else,意味着还没有找到,因此需要往后继续遍历
					//但是:pPre的意义是每一次处于被删除结点的前一个位置
					pPre = pDel;
					pDel = pDel->pNext;
				}
			}
		}
	}
	return OK;
}

3、查找商品信息

         在查找商品的过程中,为了区分是单个查找或者一次性全部查找,我分别开来写了,但是全部查找商品信息的接口放了另外一个子函数(在这里实现单个查找商品时的引子编写的是根据ID号,依据显示生活更多应该是商品的名称,当然这一方面还是可以优化,有心的小猿们可以自己编写)

3.1、

int SearchCommodityMessage(Hash *pHash, int ID, data_type *pData)
{
	if(NULL == pHash)
	{
		return CREAT_ERROR;
	}
	if(ID < 0 || ID > SIZE)
	{
		return ID_ERROR;
	}

	//根据传入的ID 进行不同的操作
	if(0 == ID)
	{
		//查看所有商品信息
		ShowAllCommodityMessage(pHash);
	}
	else
	{
		//查看指定的商品信息 
		int Index = ID - 1;
		HashNode *pShow = pHash->HashArr[Index];
		//遍历pShow开始的有可能的单链表
		while(NULL != pShow)
		{
			if(ID == pShow->data.ID)
			{
				//判断第三个参数是否为NULL 决定执行不同的操作
				if(NULL == pData)
				{
					//只想查看ID这个人的信息
					printf("*********  %d商品信息如下  ***********\n",pShow->data.ID);
					printf("商品名称:%s\n",pShow->data.Name);
					printf("分类:    %s\n",pShow->data.Classify);
					printf("价格:    %d\n",pShow->data.Price);
					printf("数量:    %d\n",pShow->data.Quantity);
					printf("过期时间:%s\n",pShow->data.Expiration);
					printf("\n");
				}
				else
				{
					*pData = pShow->data;
				}
				break;
			}
			//更新pShow的指向
			pShow = pShow->pNext;
		}
		//判断引起while终止的条件
		if(NULL == pShow)
		{
			printf("需要查找的%d商品不存在!",ID);
			return NO_EXIST;
		}
	}
	return OK;
}

3.2、全部查找

采用遍历的方法依次遍历各个结点并打印出商品的信息(指针的走向要极为清楚)

int ShowAllCommodityMessage(Hash *pHash)
{
	if(NULL == pHash)
	{
		return CREAT_ERROR;
	}
	//显示所有商品信息
	//思路:遍历哈系表(可能存在遍历哈系表中某个指针元素时,会去遍历单链表)
	int i;
	HashNode *pTemp = NULL;
	printf("目前商品的个数为:%d个,具体的信息如下:\n",pHash->count);
	for(i=0;i<pHash->LastID;i++)
	{
		pTemp = pHash->HashArr[i];
		while(NULL != pTemp)
		{	
			printf("**********  %d 号商品信息如下  ************\n",pTemp->data.ID);
			printf("商品名称:%s\n",pTemp->data.Name);
			printf("分类:%s\n",pTemp->data.Classify);
			printf("价格:%d\n",pTemp->data.Price);
			printf("数量:%d\n",pTemp->data.Quantity);
			printf("过期时间:%s\n",pTemp->data.Expiration);
			printf("\n");

			//更新指针的指向
			pTemp = pTemp->pNext;
		}
	}
	return OK;
}

4、更改商品信息

int AlterCommodityMessage(Hash *pHash, data_type DestinationData)
{
	if(NULL == pHash)
	{
		return CREAT_ERROR;
	}

	int Index = DestinationData.ID - 1;
	HashNode *pTemp  = pHash->HashArr[Index];
	while(NULL != pTemp)
	{
		//判断pTemp->data.ID 是否等于DestinationData.ID 
		if(DestinationData.ID == pTemp->data.ID)
		{
			//结构体变量可以直接赋值
			pTemp->data = DestinationData;
			break;
		}
		pTemp = pTemp->pNext;
	}
	//判断引起while终止的原因
	if(NULL == pTemp)
	{
		printf("需要修改的商品不存在!\n");
	}
	return OK;
}


以上是所有针对于商品的各功能的子函数,除此之外还需要在main函数中调用(这一部分可变性多样,可以根据自己喜欢的方式编写)源代码压缩文件想要参考的小猿可在主页下篇获取,

欢迎各位猿友评论留言,写下你宝贵的意见*****

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~剧终~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值