指针牌代替功能C ++

时间:2014-02-09 22:31:22

标签: c++ pointers replace linked-list singly-linked-list

我要做的是:

将功能替换添加到通过卡作为参数按值传递的卡组类。该 卡放在甲板的底部

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

3 个答案:

答案 0 :(得分:1)

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

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

enter image description here

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

修改

如果您使用循环列表,则可以节省扫描最后一个节点列表的工作量。您可以存储指向最后一个节点的指针,其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;
}