C 批量更新产品
我正在做一个订单程序,我有一个产品的二叉搜索树,项目包含产品名称、库存数量、订单数量和价格。当我编辑订单时,所选项目中的订单数量会根据订单增加 我需要创建一个名为batchUpdate的函数,该函数遍历树,用每个项目的订单数量减去库存数量,显然再次将订单数量设置为0。创建新订单时,订单数量正在更新,但由于某些原因,没有发生任何事情。以下是一些片段:C 批量更新产品,c,pointers,binary-tree,C,Pointers,Binary Tree,我正在做一个订单程序,我有一个产品的二叉搜索树,项目包含产品名称、库存数量、订单数量和价格。当我编辑订单时,所选项目中的订单数量会根据订单增加 我需要创建一个名为batchUpdate的函数,该函数遍历树,用每个项目的订单数量减去库存数量,显然再次将订单数量设置为0。创建新订单时,订单数量正在更新,但由于某些原因,没有发生任何事情。以下是一些片段: void BatchUpdate(PTree * pt) //PTree is a typedef, the tree { if (PTre
void BatchUpdate(PTree * pt) //PTree is a typedef, the tree
{
if (PTreeIsEmpty(pt))
puts("Nothing to update!");
else
{
puts("test"); //just for debug, it is still being displayed
TraverseP(pt,MinusStock); //Traverses the tree, and applies function
//MinusStock to each item in the node
}
}
void MinusStock(Prdct C) //Prdct is a typedef of struct containing details
{
C.StockQ = C.StockQ - C.OrderQ;
C.OrderQ = 0;
}
void TraverseP(const PTree * ptree, void (* pfun)(Prdct item))
{
if (ptree != NULL)
InOrderP(ptree->root,pfun);
}
static void InOrderP(const PNode * root, void (* pfun)(Prdct item))
{
if (root != NULL)
{
(*pfun)(root->item);
InOrderP(root->left, pfun);
InOrderP(root->right, pfun);
}
}
没有给出错误,它只是忽略遍历,并显示puts(“测试”)
void MinusStock(Prdct C) //Prdct is a typedef of struct containing details
{
C.StockQ = C.StockQ - C.OrderQ;
C.OrderQ = 0;
}
这就是问题所在,您是按值取,这意味着任何更改都不会影响树元素,因为您操作的是在该函数终止后被销毁的数据副本
这可以通过进行以下更改来解决
void MinusStock(Prdct* C){
^
这意味着您将产品结构作为指针,因此对它的任何更改都是持久的
为此,您还需要更改调用方式,(*pfun)(&root->item)代码>以及如何访问变量,C->OrderQ=0代码>,以及如何定义函数指针,void(*pfun)(Prdct*项)
感谢@MathewHall正确指出这是一个C问题
总而言之,遍历正在发生,但它并没有改变树,而是在对每个元素进行操作之前创建它们的副本,使树保持原样。问题被标记为C
,而不是C++
-我想这些将是结构,不是对象,所以更改需要是将参数更改为pfun
和MinusStock
指针,而不是引用。我将尝试一下,遍历和排序函数的工作方式与其他函数的工作方式相同,例如保存到二进制文件和搜索。我想我将制作一个副本并稍微修改它们。thanks@PatrickBuhagiar希望复印件仅供测试,请记住。您不需要复制。@PatrickBuhagiar保存和搜索不受此问题影响的原因是它们不修改树。老实说,我对C不太熟悉,这是我的第一个程序。实际上,我将尝试找到复制的替代方案