0

私は注文プログラムを行っており、製品のバイナリ検索ツリーを持っています。アイテムには、製品名、在庫数量、注文数量、および価格が含まれています。注文を作成すると、選択した商品の注文数量が注文に応じて増加します。

ツリーを通過し、各アイテムの注文数量によって在庫数量を減算し、明らかに注文数量を再び 0 に設定する、batchUpdate と呼ばれる関数を作成する必要があります。新しい注文が作成されると注文数量が更新されますが、何らかの理由で何も起こりません。ここにいくつかのスニペットがあります:

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){
                     ^

これは、product 構造体をポインターとして取得するため、それに対する変更が永​​続的であることを意味します。

これを行うには、変数 の呼び出し(*pfun)(&root->item);方法とアクセス方法C->OrderQ = 0;、および関数ポインター の定義方法の両方を変更する必要がありますvoid (* pfun)(Prdct* item)

これがCの質問であることを正しく指摘してくれてありがとう@MathewHall。

要約すると、トラバースは発生していますが、ツリーを変更するのではなく、各要素を操作する前に各要素のコピーを作成し、ツリーをそのまま残します。

于 2013-01-09T01:19:58.393 に答える