[英]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
設置為pFront
或NULL
進行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. p
和pLastPlayer
相同...因此列表結束后。 p
將等於NULL
,您的代碼將在嘗試取消引用p->pData
崩潰。 2. p
和pLastPlayer
是不同的...因此,列表pLastPlayer
結束后,代碼將在pLastPlayer = pLastPlayer -> pNext();
處崩潰pLastPlayer = pLastPlayer -> pNext();
因為您可能正在取消引用垃圾或NULL
值;
您需要在某些時候檢查NULL指針,在p -> pData != NULL
或pLastPlayer = pLastPlayer -> pNext();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.