0

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

我需要创建一个名为 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("test")

4

1 回答 1

0
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* item)

感谢@MathewHall 正确指出这是一个 C 问题。

总而言之,遍历正在发生但它并没有改变树,而是在对每个元素进行操作之前创建每个元素的副本,使树保持原样。

于 2013-01-09T01:19:58.393 回答