C++ 卡的指针组取代功能C++;

C++ 卡的指针组取代功能C++;,c++,pointers,replace,linked-list,singly-linked-list,C++,Pointers,Replace,Linked List,Singly Linked List,我要做的是: 将函数replace添加到通过值作为参数传递给卡片的deck类中。这个 卡片放在卡片组的底部 CardPtr是一个私有类变量,它被设置为构造函数中卡片组的顶部卡片 node<card> *newCard; //card pointer newCard = new node<card>(card(2, 0), NULL); //points to the first card CardPtr = newCard; //sets cardpointer to

我要做的是:

将函数replace添加到通过值作为参数传递给卡片的deck类中。这个 卡片放在卡片组的底部

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
节点*newCard//卡片指针
newCard=新节点(card(2,0),空)//指向第一张牌
CardPtr=新卡//将cardpointer设置为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;
}
`void-deck::replace(卡片底部的卡片)
{
整数计数=0;
节点*replaceptr;
底部=空;
replaceptr=新节点(BottomCard,空);
如果(底部!=NULL)
{
底部->下一步=replaceptr;
}
其他的
{
底部=更换件;
}
如果(计数>=52)
{
抛出溢出错误(“错误:甲板已满”);
}
//CardPtr=新节点(底部卡片,空);
//底部->下一步=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          
        }
    }
}
deck::deck()//deck构造函数
{
node*newCard;//卡指针
newCard=new节点(card(2,0),NULL);//指向第一张卡
CardPtr=newCard;//将cardpointer设置为newCard
对于(int i=0;i<4;i++)
{
对于(int j=2;j<15;j++)
{
如果(i==0&&j==2)继续;
node*temp=new node(card(j,i),NULL);//临时指针将卡片值和套装设置为数值和套装的数字
newCard->next=temp;//设置newCard指针。在temp旁边
newCard=temp;//将newCard设置为temp
}
}
}
您需要确定列表中倒数第二个节点(位于底部卡之前的卡),因为该节点的
下一个
指针需要指向新的底部卡

然后,只需将倒数第二个节点的
next
条目更改为新节点

(请确保在插入新的底部卡节点后删除旧的底部卡节点,否则可能导致内存泄漏)

编辑

如果使用循环列表,则可以省去扫描列表中最后一个节点的工作量。您可以存储指向最后一个节点的指针,其
next
指针(而不是null)将引用第一个节点。

您需要确定列表中倒数第二个节点(底部卡之前的卡),因为该节点的
next
指针将需要引用新的底部卡

然后,只需将倒数第二个节点的
next
条目更改为新节点

(请确保在插入新的底部卡节点后删除旧的底部卡节点,否则可能导致内存泄漏)

编辑

如果使用循环列表,则可以省去扫描列表中最后一个节点的工作量。您可以存储指向最后一个节点的指针,其
next
指针(而不是null)将引用第一个节点。

您需要确定列表中倒数第二个节点(底部卡之前的卡),因为该节点的
next
指针将需要引用新的底部卡

然后,只需将倒数第二个节点的
next
条目更改为新节点

(请确保在插入新的底部卡节点后删除旧的底部卡节点,否则可能导致内存泄漏)

编辑

如果使用循环列表,则可以省去扫描列表中最后一个节点的工作量。您可以存储指向最后一个节点的指针,其
next
指针(而不是null)将引用第一个节点。

您需要确定列表中倒数第二个节点(底部卡之前的卡),因为该节点的
next
指针将需要引用新的底部卡

然后,只需将倒数第二个节点的
next
条目更改为新节点

(请确保在插入新的底部卡节点后删除旧的底部卡节点,否则可能导致内存泄漏)

编辑


如果使用循环列表,则可以省去扫描列表中最后一个节点的工作量。您可以存储指向最后一个节点的指针,其
下一个
指针(而不是null)将指向第一个节点。

如果
CardPtr
负责始终指向顶部卡片(链接列表的开头),然后应更改此方法的代码,使其不会修改
CardPtr
。也许可以声明另一个局部变量,将其初始化为等于
CardPtr
,然后在循环中重复修改该指针(以便
CardPtr
永不更改)


也可能是您的另一种从牌组顶部发牌的方法没有使
CardPtr
处于良好状态(指向新的顶部牌),这意味着您有多个问题需要解决。

如果
CardPtr
负责始终指向顶部牌(链接列表的开头),然后应更改此方法的代码,使其不会修改
CardPtr
。也许可以声明另一个局部变量,将其初始化为等于
CardPtr
,然后在循环中重复修改该指针(以便
CardPtr
永不更改)

也有可能是您的另一种从牌组顶部发牌的方法没有使
CardPtr
处于良好状态(指向新的顶部牌),这意味着您得到了
bottom = new node <card>;

while (CardPtr != NULL)
{
    if (CardPtr->next == NULL)
    {
        bottom = CardPtr;
    }
}
CardPtr = new node<card>(BottomCard, NULL);
if ( bottom != NULL )
{
  bottom->next = CardPtr;
}
else
{
  bottom = CardPtr;
}