Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 批量更新产品_C_Pointers_Binary Tree - Fatal编程技术网

C 批量更新产品

C 批量更新产品,c,pointers,binary-tree,C,Pointers,Binary Tree,我正在做一个订单程序,我有一个产品的二叉搜索树,项目包含产品名称、库存数量、订单数量和价格。当我编辑订单时,所选项目中的订单数量会根据订单增加 我需要创建一个名为batchUpdate的函数,该函数遍历树,用每个项目的订单数量减去库存数量,显然再次将订单数量设置为0。创建新订单时,订单数量正在更新,但由于某些原因,没有发生任何事情。以下是一些片段: void BatchUpdate(PTree * pt) //PTree is a typedef, the tree { if (PTre

我正在做一个订单程序,我有一个产品的二叉搜索树,项目包含产品名称、库存数量、订单数量和价格。当我编辑订单时,所选项目中的订单数量会根据订单增加

我需要创建一个名为batchUpdate的函数,该函数遍历树,用每个项目的订单数量减去库存数量,显然再次将订单数量设置为0。创建新订单时,订单数量正在更新,但由于某些原因,没有发生任何事情。以下是一些片段:

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不太熟悉,这是我的第一个程序。实际上,我将尝试找到复制的替代方案