所以我的一个功能遇到了一些问题。该程序(用C ++编写)玩游戏,有很多玩家坐在桌旁。每次调用我的游戏功能时,它都应该在游戏中向玩家显示游戏。每次调用它时都应按顺序显示播放器。在它击中最后一个玩家后,它将在列表/表格的开头返回。 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 Takes然而,转弯之后,它就会崩溃。 那我的代码有什么问题?有没有更好的方法来写这个?
答案 0 :(得分: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-&gt; pNext将为空,下一次调用将重置为列表的头部。
至少那些我认为你想要的东西。通过将pNextPlayer
设置为pFront
或NULL
来填充此值;没有区别。
答案 1 :(得分:0)
你使用的是C ++,使用std :: list比使用自己的实现更好。
有些东西让我烦恼:你为什么用“p =(* pFront).pNext”开始你的循环,而不是用“p = pFront”直接开始?
如何将节点添加到列表中?你应该在“C转弯”之前回应“A转弯”。
如果您确实添加到列表的前面(并且列表是双重链接的),则应该调用pPrevious而不是pNext。
答案 2 :(得分: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();
崩溃,因为您可能正在取消引用垃圾或{{ 1}}价值;
您需要在NULL
或p -> pData != NULL