我要做的是:
将功能替换添加到通过卡作为参数按值传递的卡组类。该 卡放在甲板的底部
CardPtr是一个私有类变量,它被设置为构造函数中卡片的顶部卡片
node<card> *newCard; //card pointer
newCard = new node<card>(card(2, 0), NULL); //points to the first card
CardPtr = newCard; //sets cardpointer to newcard
一个单独的类将顶部卡关闭并覆盖该值,在该过程中从该套牌中删除该节点。我试图把那张卡放回到底部。那么这就是代码:
`void deck::replace(card BottomCard)
{
int count = 0;
node<card> *replaceptr;
bottom = NULL;
replaceptr = new node<card>(BottomCard, NULL);
if (bottom != NULL)
{
bottom->next = replaceptr;
}
else
{
bottom = replaceptr;
}
if (count >= 52)
{
throw overflowError("ERROR: Deck is already full");
}
//CardPtr = new node<card>(BottomCard, NULL);
//bottom->next = CardPtr;
}
我在我的主代码中实现它,它似乎取代了卡片顶部的卡片。有人可以帮我吗?谢谢。
这是我完整的构造函数:
deck::deck() // deck constructor
{
node<card> *newCard; //card pointer
newCard = new node<card>(card(2, 0), NULL); //points to the first card
CardPtr = newCard; //sets cardpointer to newcard
for (int i = 0; i < 4; i++)
{
for (int j = 2; j < 15; j++)
{
if (i == 0 && j == 2) continue;
node<card> *temp = new node<card>(card(j, i), NULL); // temporary pointer sets card value and suit to numbers for value and suit
newCard->next = temp;// sets newcard pointer .next to temp
newCard = temp;// sets newcard to temp
}
}
}
答案 0 :(得分:1)
您需要确定列表中的倒数第二个节点(底部卡之前的卡),因为该节点的next
指针需要引用新的底部卡。
然后,只需将倒数第二个节点的next
条目更改为新节点。
(确保在插入新的底部卡节点后删除旧的底部卡节点,否则可能会导致内存泄漏)
修改强>
如果您使用循环列表,则可以节省扫描最后一个节点列表的工作量。您可以存储指向最后一个节点的指针,其next
指针(而不是null)将引用第一个节点。
答案 1 :(得分:1)
如果CardPtr
始终指向顶部卡片(链接列表的开头),则应更改此方法的代码,以便不会修改 { {1}}。也许声明另一个局部变量,将其初始化为等于CardPtr
,然后在循环中重复修改 指针(以便CardPtr
永远不会改变)。
你的另一种从牌组顶部处理牌的方法也可能不会让CardPtr
处于良好状态(指向新的顶牌),这意味着你有不止一张牌需要修复的问题。
答案 2 :(得分:1)
看这里
bottom = new node <card>;
while (CardPtr != NULL)
{
if (CardPtr->next == NULL)
{
bottom = CardPtr;
}
首先分配一张新卡并将其分配到底部,然后在你的while循环中将底部分配给CardPtr,这将导致内存泄漏。你应该删除新的,只需将bottom设置为NULL。
CardPtr = new node<card>(BottomCard, NULL);
if ( bottom != NULL )
{
bottom->next = CardPtr;
}
else
{
bottom = CardPtr;
}