【问题标题】:Pointer deck of cards replace function C++指针卡替换函数 C++
【发布时间】:2014-02-09 22:31:22
【问题描述】:

我要做的是:

向卡片组类添加一个函数replace,该函数按值作为参数传递卡片。这 卡片放在牌库的底部

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

【问题讨论】:

  • 请发布一个最小的可编译测试用例。至少包含带有属性的类定义(我想CardPtr 是一个类属性)。
  • 您发布的代码还有其他问题。一个明显的错误是您为“底部”分配内存,然后在您的 while 循环中替换“底部”的值。因此,您有内存泄漏。
  • CardPtr的初始值是多少?从给定的代码中并不清楚,这可能对您的逻辑至关重要。

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


【解决方案1】:

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

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

【讨论】:

  • CardPtr 在其他方法中每次都指向正确的卡片,所以我会尝试创建一个新指针。
  • 疑难解答提示:创建另一个检索卡组底部节点的方法。您可以在此方法中使用该方法来查找底部节点,也可以在其他方法调用(例如发牌的方法)之后调用它,以验证一切都在它应该在的位置。
  • 我已经编辑了我的代码,它在 52 卡后返回退出。我假设我需要编辑我的构造函数?
  • 明白了!希望我能给大家一个答案,因为组合帮助了我......我最终需要做的不是改变 cardptr,所以非常感谢你
  • 很高兴听到这个消息! (记住:不要丢掉那个列表的头,否则你永远不会找回它!):-)
【解决方案2】:

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

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

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

编辑

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

【讨论】:

  • 谢谢,我有一个单独的函数来处理最上面的牌,然后我把那张牌传进去,就像用这个函数把最上面的牌放在下面一样……但我不能似乎把这个逻辑搞砸了,我到底要怎么找第二个到最后?
  • 看看我添加的图形。您可以通过检查其下一个节点的next 条目是否为空来判断一个节点是否包含最后一个之前的卡片。
  • 也许@Tony the Pony 误解了目标,这对我来说也不完全清楚。似乎您不是在尝试“替换”已经在牌组中的牌(将其取出并放入给定的牌),而是在牌组底部“放置”给定的牌。我说的对吗?
  • 只需声明两个指针,一个指针在另一个之前是“一个”。推进每个指针,直到前面的指针到达终点。然后你知道另一个指针在它后面,即倒数第二个。
  • 要明确一点,替换卡已经在套牌中了吗?如果是这样,您还需要从列表中取消其节点的链接,否则您将得到一个搞砸的列表。
【解决方案3】:

看这里

bottom = new node <card>;

while (CardPtr != NULL)
{
    if (CardPtr->next == NULL)
    {
        bottom = CardPtr;
    }
}

首先,您分配一张新卡并将其分配给bottom,然后在您的while 循环中将bottom 分配给CardPtr,这将导致内存泄漏。您应该删除 new 并将 bottom 设置为 NULL

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

【讨论】:

  • 当我实现它时,它仍然只是一遍又一遍地打印出同一张卡片,我知道它一定是替换功能,因为没有它,它会经过 52 次直到牌堆空
猜你喜欢
  • 2015-10-16
  • 2011-07-31
  • 1970-01-01
  • 2012-11-21
  • 2014-06-15
  • 1970-01-01
  • 2021-03-23
  • 2023-03-29
  • 1970-01-01
相关资源
最近更新 更多