0

だから私は自分の機能の1つに問題があります。プログラム (C++) がゲームをプレイし、非常に多くのプレイヤーがテーブルに座っています。play 関数が呼び出されるたびに、ゲーム内のプレーヤーがコンソールに表示されます。呼び出されるたびに、プレーヤーを順番に表示する必要があります。最後のプレーヤーに当たった後、リスト/テーブルの先頭に戻ります。void CircleList::play()

LinkedListOfPlayersNode *p=(*pFront).pNext;
if (p->pData!=NULL)
{
    cout<<p->pData->getName()+" takes a turn\n";


    pLastPlayer = pLastPlayer->pNext;
}
else
{
    cout<<"There are no players. Please ADD a player.\n";
}

}

つまり、A、B、C を追加するとします。PLAY コマンドを使用すると、C がターンを実行し、次に B、A が実行されます。現在、上記のコードを使用すると、C がターンを実行し、ただし、その直後にクラッシュします。では、私のコードの何が問題なのですか? これを書く良い方法はありますか?

4

3 に答える 3

1

そのトラバーサルを次のようにしたいと思っていると確信しています。

LinkedListOfPlayersNode *p = pNextPlayer ? pNextPlayer : pFront;

if (p && p->pData) // not sure why pData is also dynamic. look into that.
{
    cout<<p->pData->getName()+" takes a turn\n";
    pNextPlayer = p->pNext;
}
else
{
    cout<<"There are no players. Please ADD a player.\n";
}

プレーヤーの番が来るたびに、彼らはそれを取り、次のプレーヤーがそのプレーヤーの次のポインターになります。テーブルにいる最後のプレイヤーがターンを行うと、p->pNext は null になり、次の呼び出しはリストの先頭にリセットされます。

少なくともそれはあなたが取得しようとしていると私が思うところです。またはpNextPlayerに設定してこれをプライミングします。違いはありません。pFrontNULL

于 2012-09-29T22:01:06.977 に答える
0

pnext = NULLノードの作成中に最初に定義したとしましょう。

あなたのコードによると;

if (p->pData!=NULL)
{
    cout<<p->pData->getName()+" takes a turn\n";
    pLastPlayer = pLastPlayer->pNext;
}
else
{
    cout<<"There are no players. Please ADD a player.\n";
}

私の仮定によると、2 つのシナリオがありpますpLastPlayerpと等しくなるとNULL、逆参照しようとするとコードがクラッシュしますp->pData。2.ppLastPlayerは異なります...したがって、リストが終了した後、おそらくガベージまたは値を逆参照しているpLastPlayerため、コードはでクラッシュします。pLastPlayer = pLastPlayer -> pNext();NULL

p -> pData != NULLまたはで、ある時点で NULL ポインターをチェックする必要があります。pLastPlayer = pLastPlayer -> pNext();

于 2012-09-29T21:55:36.333 に答える
0

あなたは C++ を使用しています。独自の実装を作成するよりも、std::list を使用したほうがよいでしょう。

「p = pFront」でループを開始するのではなく、「p = (*pFront).pNext」でループを開始するのはなぜですか?

ノードをどのようにリストに追加していますか? 「C がターンします」の前に「A がターンします」とエコーする必要があります。

実際にリストの先頭に追加する場合 (そしてリストが二重にリンクされている場合)、pNext ではなく pPrevious を呼び出す必要があります。

于 2012-09-29T21:47:16.623 に答える