2012-09-29 272 views
0

所以我在使用我的某個函數時遇到了一些麻煩。程序(用C++)玩遊戲,桌子上坐着很多玩家。每次我的播放功能被調用時,它應該向遊戲機中的玩家顯示。每次調用時都應該依次顯示玩家。在它擊中最後一名玩家後,它將在列表/表格的開始處開始。 無效CircleList ::玩()鏈接列表的循環遍歷

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轉了一圈,但是,之後它立即崩潰。 那麼我的代碼有什麼問題?有沒有更好的方法來寫這個?

+0

嘗試通過調試器逐步完成它......您的指針之一可能是錯誤的。 – Cornstalks

+0

我建議你在列表中使用默認元素而不是null元素,這將爲你節省很多時間調試。 – user1708860

+0

在檢查'p-> pData之前檢查p!= NULL' – MarsRover

回答

0

你在C++中,你最好用std :: list比編寫你自己的實現更好。

有些東西在擾亂我:你爲什麼要用「p =(* pFront).pNext」開始你的循環,而不是用「p = pFront」直接啓動它?

如何將節點添加到列表中?你應該在「C輪到」之前回應「A輪到」。

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

+0

我假設他加入到列表的前面。 – CrazyCasta

+0

是的,它添加在列表的前面。具體來說,它應該添加在最後一個玩家之後。 –

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"; 
} 

有根據我的假設2種情況:1。 和ppLastPlayer一樣......所以後面的列表結束。 p將等於NULL,您的代碼將會崩潰,因爲它會嘗試解除引用p->pData。 2. ppLastPlayer是不同的...因此,在列表pLastPlayer結束後,代碼將崩潰在pLastPlayer = pLastPlayer -> pNext();,因爲您可能取消了引用垃圾或NULL的值;

您需要在某一時刻檢查NULL指針,無論是在p -> pData != NULLpLastPlayer = pLastPlayer -> pNext();

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;沒有區別。