0

因此,我的一项功能遇到了一些麻烦。程序(用 C++ 编写)玩游戏,有很多玩家坐在桌旁。每次调用我的 play 函数时,它都应该向控制台显示游戏中的玩家。每次调用它都应该按顺序显示玩家。在它击中最后一个玩家后,它将从列表/表格的开头重新开始。无效的 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 Takes a Turn,但是,它在那之后立即崩溃。那么我的代码有什么问题?有没有更好的方法来写这个?

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 将为空,并且下一次调用将重置为列表的头部。

至少那是我认为你想要得到的地方。将pNextPlayer其设置为pFrontNULL; 没什么区别。

于 2012-09-29T22:01:06.977 回答
0

您在 C++ 中,使用 std::list 比编写自己的实现更好。

有些事情困扰着我:为什么你用“p = (*pFront).pNext”开始循环,而不是直接用“p = pFront”开始循环?

您如何将节点添加到列表中?您应该在“C 转弯”之前回显“A 转弯”。

如果您确实要添加到列表的前面(并且您的列表是双向链接的),您应该调用 pPrevious 而不是 pNext。

于 2012-09-29T21:47:16.623 回答
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";
}

根据我的假设有两种情况: 1.p并且pLastPlayer是相同的......所以在列表结束之后。p将等于NULL,您的代码将在尝试取消引用时崩溃p->pData。2.p并且pLastPlayer是不同的......所以在列表pLastPlayer结束后,代码将崩溃,pLastPlayer = pLastPlayer -> pNext();因为您可能正在取消引用垃圾或NULL值;

您需要在某个时候检查 NULL 指针,无论是 inp -> pData != NULL还是pLastPlayer = pLastPlayer -> pNext();

于 2012-09-29T21:55:36.333 回答