0
        {
            int a[3];
            mainClassStack.pushNumber(a[1,2,3]);
            break;
        }

void stack_class::pushNumber(int numberFunc)
{
    if(head==NULL)
    {
        head = new stack_struct;
        head->number = numberFunc;
        head->next_number = NULL;
        tailPointer=head;
    }
    else
    {
        pointerFunc = new stack_struct;
        pointerFunc->number=numberFunc;
        pointerFunc->next_number=NULL;
        head->next_number=pointerFunc;
        head=pointerFunc;
    }
}


void stack_class::pushNumber(char charFunc)
{

    int a=0;
    a=charFunc;
    if(head==NULL)
    {
        head = new stack_struct;
        head->number = a;
        head->next_number = NULL;
        tailPointer=head;
    }
    else
    {
        pointerFunc = new stack_struct;
        pointerFunc->number=a;
        pointerFunc->next_number=NULL;
        head->next_number=pointerFunc;
        head=pointerFunc;
    }

}


void stack_class::pushNumber(int arrayFunc[3])
{
    if(head==NULL)
    {
        for(int i=0;i<3;i++)
        {
            head = new stack_struct;
            head->number = arrayFunc[i];
            head->next_number = NULL;
            tailPointer=head;
        }
    }
    else
    {
        for(int i=0;i<3;i++)
        {
            pointerFunc = new stack_struct;
            pointerFunc->number=arrayFunc[i];
            pointerFunc->next_number=NULL;
            head->next_number=pointerFunc;
            head=pointerFunc;
        }
    }
}

関数をオーバーロードし、配列を適切な関数にプッシュします。これにより、後で配列の値が動的リンクリストに追加されます。ここまで書いてきましたが、連結リストを印刷しようとするとゴミが表示されます。ここで何が間違っていますか?

4

3 に答える 3

0

他の人が指摘していることをより明確にするために、カンマ演算子はシリーズの最後の値を返します。したがって、式の値は であり、(1, 2, 3)したがって3、式a[1, 2, 3]は長い言い方にすぎませんa[3]

しかし、すぐに間抜けに見えるものがあります。それは、次のループです。

if(head==NULL)
{
    for(int i=0;i<3;i++)
    {
        head = new stack_struct;
        head->number = arrayFunc[i];
        head->next_number = NULL;
        tailPointer=head;
    }
}

新しいものを指しhead、その中にいくつかのものを設定し、同じ新しいものを指すように tailPointer を設定します...しかし、すぐに同じことをさらに 2 回行います。問題が見えますか?ループの最後で、next_number値が allNULLである 3 つの項目が作成されheadtailPointer両方とも同じもの (最後に作成されたもの) を指しています。作成した最初の 2 つのアイテムを指しているものは何もなく、互いに指しているものもありません。つまり、この操作の最後には、リンクされたリストはまったくありません (ただし、メモリ内のどこかに、アクセスしたり割り当てを解除したりする方法のない新しいオブジェクトがいくつかあります)。

おそらく、ループ内に if ステートメントを入れることを意味しているのであって、その逆ではありませんが、それ以上の変更を行う必要があります。これは、他の for ループ内のコードにも少し問題がある可能性があるためです。新しいアイテムを作成し、ヘッドアイテムから新しいアイテムへのリンクを設定しますが、ヘッドを移動して新しいアイテムを指すようにするため、リストの末尾にアイテムを正常に追加していますが、自分自身を残していますhead実際に末尾を指している変数を使用します。

何が起こっているかを確認する最善の方法は、鉛筆と紙を用意し、変数を書き留めて、オブジェクトを表すボックスを描画し、メンバー変数を内部に配置してから、コードに従って変数値を書き込んでいくことです。または、ポインターから矢印を消去して描画し、それぞれが着地する場所を示します。アルゴリズムがどこでうまくいかないかすぐにわかると思います。

于 2013-04-11T04:14:40.023 に答える
0

C++ では、配列全体を引数として関数に渡すことはできません。ただし、インデックスなしで配列の名前を指定することにより、配列へのポインターを渡すことができます。

1 次元配列を関数の引数として渡したい場合は、次の 3 つの方法のいずれかで関数の仮パラメーターを宣言する必要があります。3 つの宣言方法はすべて、整数ポインターが移動することをコンパイラーに伝えるため、3 つの宣言方法はすべて同様の結果を生成します。受信する。

方法-1

次のようなポインタとしての仮パラメータ:

void myFunction(int *param) { . . . }

方法-2

次のようなサイズの配列としての仮パラメータ:

void myFunction(int param[10]) { . . . }

方法-3

次のようなサイズのない配列としての仮パラメータ:

void myFunction(int param[]) { . . . }

于 2013-04-11T05:08:47.057 に答える