循环遍历链表

时间:2012-09-29 21:42:12

标签: c++ data-structures linked-list

所以我的一个功能遇到了一些问题。该程序(用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然而,转弯之后,它就会崩溃。 那我的代码有什么问题?有没有更好的方法来写这个?

3 个答案:

答案 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设置为pFrontNULL来填充此值;没有区别。

答案 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. ppLastPlayer是相同的......所以在列表结束后。 p将等于NULL,您的代码会在尝试取消引用p->pData时崩溃。  2. ppLastPlayer不同......因此,在列表pLastPlayer结束后,代码将在pLastPlayer = pLastPlayer -> pNext();崩溃,因为您可能正在取消引用垃圾或{{ 1}}价值;

您需要在NULLp -> pData != NULL

的某个位置检查NULL指针