-5
insert(char * key, struct node *leaf, int x)
{
    if (x==1) //Customer
    {
        if( strcmp(leaf->customer.IDNo,root->customer.IDNo)==0 )
        {
            *leaf = (struct node) malloc(101);
            *leaf->customer.IDNo = key;
            /* initialize the children to null */
            (*leaf)->left = 0;
            (*leaf)->right = 0;
        }

        else if(strcmp(key,(*leaf)->customer.IDNo)<0)
        {
            insert( key, &(*leaf)->left );
        }

        else if(strcmp(key,(*leaf)->customer.IDNo)>0)
        {
            insert( key, &(*leaf)->right );
        }
    }

    else //Product
    {
        if( strcmp(leaf->product.ProdName,root->product.ProdName)==0 )
        {
            *leaf = (struct node) malloc(101);
            (*leaf)->product.ProdName = key;
            /* initialize the children to null */
            (*leaf)->left = 0;
            (*leaf)->right = 0;
        }

        else if(strcmp(key,(*leaf)->product.ProdName)<0)
        {
            insert( key, &(*leaf)->left );
        }

        else if(strcmp(key,(*leaf)->product.ProdName)>0)
        {
            insert( key, &(*leaf)->right );
        }
    }
}

45,64 非スカラー型要求への変換 46 割り当ては、キャストなしでポインターから整数を作成します 48,49,51,53,55,57,65,67,68,70,72,74,76 - の無効な型引数> (構造体ノードを持っている) 53,57,72,76 関数「挿入」への引数が少なすぎます

Node *search(char * key, struct node *leaf,int x)
{
    struct node * y;

    if (x==1)
    {
        if( leaf != 0 )
        {
            if(strcmp(key,leaf->customer.IDNo)==0)
            {
                y= leaf;
            }

            else if(strcmp(key,leaf->customer.IDNo)<0)
            {
                y= search(key, leaf->left);
            }

            else
            {
                y= search(key, leaf->right);
            }
        }
    }

    else if (x==2)
    {

        if( leaf != 0 )
        {
            if(strcmp(key,leaf->product.ProdName)==0)
            {
                y= leaf;
            }

            else if(strcmp(key,leaf->product.ProdName)<0)
            {
                y= search(key, leaf->left);
            }

            else
            {
                y= search(key, leaf->right);
            }
        }
    }

    else y= 0;
    return y;
}

94,98,112 関数 'search' への引数が少なすぎます

複数の行で発生するエラーは似ているため、そのうちの 1 つを修正する方法を説明するだけで、残りは実行できます。

4

1 に答える 1

4

ポインターとポインターが指している対象を混同している場合、多くの問題があります。

たとえば、次のコードで:

*leaf = (struct node) malloc(101);

いくつかの重大な問題があります。

  1. malloc は、具体的な構造体ではなく、メモリへのポインターを返します。その結果、返されたポインターを構造体ノードにキャストしようとしても機能しません。具体的なノードではなく、struct node* (ノードへのポインター) にキャストする必要があります。
  2. 葉はノードへのポインタです。逆参照して反対側のノードと等しく設定しようとすると、ポインターが指している場所を変更するのではなく、ノードが指すメモリに書き込もうとします。あなたはおそらく何か他のことをしたいでしょう(以下で説明します)。
  3. 101 のような任意の数値を malloc に渡すのは、非常に危険で無駄です。代わりに、sizeof(struct node) を渡して、malloc に適切な量のスペースを与えるように依頼する必要があります。

ただし、さらに重要なのは、挿入関数内でリーフ ポインターを変更しようとしているが、リーフを値で渡しているという問題です。リーフ ポインターが指すノードを変更するには、リーフ ポインター自体ではなく、リーフ ポインターへのポインターを渡す必要があります。を使用するように署名を変更してからstruct node** leaf、コード内で leaf が指すポインターを再割り当てするようにコードを更新してください。

ここには他にも多くのポインターエラーがありますが、最終的には、それらはすべてポインターとポインターが指すものを混乱させることに起因すると思います. コードを修正するときは、ポインターが指しているオブジェクトを変更したいかどうか、または最初にどのオブジェクトが指されているかを念頭に置いてください。

お役に立てれば!

于 2013-01-06T17:33:28.170 に答える