簡體   English   中英

循環遍歷鏈接列表

[英]Circular Traversal of a Linked List

因此,我的一項功能遇到了麻煩。 該程序(使用C ++)玩游戲,並且有很多玩家坐在桌子旁。 每次調用我的游戲功能時,它都應該向控制台顯示游戲中的玩家。 每次調用它時,都應按順序顯示玩家。 擊中最后一個玩家后,它將在列表/表的開頭重新開始。 無效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進行轉彎,但是,此后它立即崩潰。 那么我的代碼有什么問題呢? 有沒有更好的方法來寫這個?

我很確定您希望遍歷看起來像這樣:

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進行pFront 沒有區別。

您使用的是C ++,使用std :: list比編寫自己的實現更好。

某事困擾着我:為什么要使用“ p =(* pFront).pNext”開始循環,而不是直接使用“ p = pFront”開始循環?

您如何將節點添加到列表中? 您應該在“ C轉向”之前回顯“ A轉向”。

如果確實要添加到列表的最前面(並且列表是雙向鏈接的),則應調用pPrevious而不是pNext。

假設您在創建節點時最初定義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種情況:1. ppLastPlayer相同...因此列表結束后。 p將等於NULL ,您的代碼將在嘗試取消引用p->pData崩潰。 2. ppLastPlayer是不同的...因此,列表pLastPlayer結束后,代碼將在pLastPlayer = pLastPlayer -> pNext();處崩潰pLastPlayer = pLastPlayer -> pNext(); 因為您可能正在取消引用垃圾或NULL值;

您需要在某些時候檢查NULL指針,在p -> pData != NULLpLastPlayer = pLastPlayer -> pNext();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM