Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在while循环中将布尔值更改为true?C++;_C++_Loops_Linked List_Conditional Statements_Nodes - Fatal编程技术网

C++ 在while循环中将布尔值更改为true?C++;

C++ 在while循环中将布尔值更改为true?C++;,c++,loops,linked-list,conditional-statements,nodes,C++,Loops,Linked List,Conditional Statements,Nodes,我有一副单链表中的卡片。我试图随机交换没有重复的值。为此,我向每个节点添加了一个布尔变量“used”,并将其设置为false。每当我使用这些卡时,我都会将其更新为true,以便不再使用它们。我试图添加一个while循环,以确保没有使用过的卡被交换。但是,一旦启动while循环,每个节点使用的变量都将设置为true,因此while循环永远不会中断。我已经在while循环之前打印了使用过的变量值,它们都设置为false。感谢您的帮助 void DeckOfCards::randomSwap() {

我有一副单链表中的卡片。我试图随机交换没有重复的值。为此,我向每个节点添加了一个布尔变量“used”,并将其设置为false。每当我使用这些卡时,我都会将其更新为true,以便不再使用它们。我试图添加一个while循环,以确保没有使用过的卡被交换。但是,一旦启动while循环,每个节点使用的变量都将设置为true,因此while循环永远不会中断。我已经在while循环之前打印了使用过的变量值,它们都设置为false。感谢您的帮助

 void DeckOfCards::randomSwap()
{
    Card* ptr = head; 
    Card* n = NULL;
    Card* temp = NULL;
    srand((unsigned)(time(0)));

    for (int i = 1; i < 52; ++i)
    {
        
        int r = rand() % 52 + 1;
        n = getNode(r);

        while(n->used != false)
        {
            r = rand() % 52 + 1;
            n = getNode(r);
        }

        temp = ptr;
        ptr->setRank(n->getRank());
        ptr->setSuit(n->getSuit());
        n->setRank(temp->getRank());
        n->setSuit(temp->getSuit());
        n->used = true;
        ptr->used = true;
        ptr = ptr->next;
    }

    std::cout << "Cards randomly swapped." << std::endl;
}
#包括“DeckOfCards.h”
#包括
#包括
DeckOfCards::DeckOfCards()
{
head=NULL;
tail=NULL;
}
DeckOfCards::~DeckOfCards()
{
head=NULL;
删除标题;
tail=NULL;
删除尾部;
}
void DeckOfCards::addNode(int r,std::string s)
{
卡*n=新卡;
n->setRank(r);
n->setSuit(s);
n->used=false;
n->next=NULL;
if(head==NULL)
{
水头=n;
尾=n;
}
其他的
{
tail->next=n;
tail=tail->next;
}
}
void DeckOfCards::createDeck()
{
对于(int i=0;i<4;++i)
{
对于(int j=0;j<13;++j)
{
addNode(排名[j],诉讼[i]);
}
}
}
作废卡片::打印()
{
卡*温度=磁头;
while(temp!=NULL)
{
std::cout next;
}
}
返回false;
}
卡片*DeckOfCards::getNode(int pos)
{
卡*温度=磁头;
对于(int i=0;i下一步;
}
返回温度;
}
void DeckOfCards::randomSwap()
{
卡*ptr=头;
卡片*n=NULL;
对于(int i=1;i<52;++i)
{
int r=rand()%52+1;
n=getNode(r);
while(n->used!=false)
{
std::cout setRank(n->getRank());
ptr->setSuit(n->getSuit());
n->setRank(tempRank);
n->setSuit(临时套装);
n->used=true;
ptr->used=true;
ptr=ptr->next;
}
std::coutgetrank();
std::string tempSuit=temp->getSuit();
temp->setSuit(ptr->getSuit());
temp->setRank(ptr->getRank());
ptr->setSuit(临时套装);
ptr->setRank(tempRank);
temp=getNode(51-i);
ptr=ptr->next;
}
标准::cout
好的,
temp
ptr
都是指向同一对象的指针

    ptr->setRank(n->getRank());
    ptr->setSuit(n->getSuit());
现在,对象
temp
ptr
都指向,并且对象
n
指向具有相同等级和适合性

    n->setRank(temp->getRank());
    n->setSuit(temp->getSuit());
哎呀,现在您将对象
n
点设置为回到原来的级别,并适合它。这不是您想要做的

你一定认为
ptr->setRank
temp->setRank
做了不同的事情。但是它们做了相同的事情,因为它们都在同一个对象上调用
setRank
。因此
temp
在这里没有任何用途。你需要一个临时对象或其他临时对象,可以在交换操作期间保持等级和适合临时指针对你没有帮助

此外:


这没有任何作用。将
next
设置为
NULL
没有任何作用,因为对象即将停止存在。在
NULL
上调用
delete
没有任何作用。那么此析构函数的用途是什么呢?

我们需要查看卡片类。这很可能是由于未初始化的变量。我的水晶球告诉我们me
getNode
更改值。我添加了card类。我认为我已正确初始化了它。因此,
srand
应该在
main
中调用一次。好的,我会解决这个问题,谢谢。我还添加了getNode,它将如何更改值?好的,我删除了temp ptr,而是创建了temp变量,然后将n设置为var不可能。但是,这仍然不能让代码运行。还有其他建议吗?@ZachSal学习自己的调试技能对你的生活会有很大帮助。我试了几个小时,我是CS一年级的学生,谢谢你的帮助。@ZachSal你必须给我足够的代码来复制问题。如果你没有一些代码就无法复制问题,那就是po问题在于代码。Kepe记住,循环中的每个过程都会设置两张卡!感谢您的回答,我认为问题肯定是randomSwap函数,但我不确定,我对编程还是很陌生。我已经上传了全部代码。
#include "DeckOfCards.h"
#include <ctime>
#include <iostream>

DeckOfCards::DeckOfCards()
{
    head = NULL; 
    tail = NULL;
}

DeckOfCards::~DeckOfCards()
{
    head = NULL; 
    delete head; 
    tail = NULL; 
    delete tail; 
}

void DeckOfCards::addNode(int r, std::string s)
{
    Card* n = new Card; 
    n->setRank(r); 
    n->setSuit(s);
    n->used = false;
    n->next = NULL;

    if (head == NULL)
    {
        head = n; 
        tail = n; 
    }
    else
    {
        tail->next = n; 
        tail = tail->next; 
    }
}

void DeckOfCards::createDeck()
{
    for (int i = 0; i < 4; ++i)
    {
        for (int j = 0; j < 13; ++j)
        {
            addNode(rank[j], suit[i]);
        }
    }
}

void DeckOfCards::print()
{
    Card* temp = head;
    while (temp != NULL)
    {
        std::cout << "(" << temp->getRank() << " of " << temp->getSuit() << ")\n";
        temp = temp->next;
    }
    std::cout << std::endl;

}

bool DeckOfCards::CardExists(int r, std::string s)
{
    Card* temp = head; 
    for (int i = 0; i < 52; ++i)
    {
        if (r == temp->getRank() && s == temp->getSuit())
            return true; 
        else
        {
            temp = temp->next;
        }
    }
    return false; 
}

Card* DeckOfCards::getNode(int pos)
{
    Card* temp = head; 
    for (int i = 0; i < pos-1; ++i)
    {
        temp = temp->next; 
    }
    return temp; 

}

void DeckOfCards::randomSwap()
{
    Card* ptr = head; 
    Card* n = NULL;

    for (int i = 1; i < 52; ++i)
    {
        
        int r = rand() % 52 + 1;
        n = getNode(r);

        while(n->used != false)
        {
            std::cout << r << " " << n->used << std::endl;
            r = rand() % 52 + 1;
            n = getNode(r);
        }

        int tempRank = ptr->getRank();
        std::string tempSuit = ptr->getSuit();
    
        ptr->setRank(n->getRank());
        ptr->setSuit(n->getSuit());
        n->setRank(tempRank);
        n->setSuit(tempSuit);

        n->used = true;
        ptr->used = true;

        ptr = ptr->next;
    }

    std::cout << "Cards randomly swapped." << std::endl;
}

void DeckOfCards::shuffleCards()
{
    Card* tail = NULL;
    Card* temp = NULL;
    Card* ptr = head;

    while (ptr != NULL)
    {
        tail = ptr;
        ptr = ptr->next;
    }

    ptr = head;
    temp = tail;

    for (int i = 0; i < 26; ++i)
    {
        int tempRank = temp->getRank();
        std::string tempSuit = temp->getSuit();

        temp->setSuit(ptr->getSuit());
        temp->setRank(ptr->getRank());

        ptr->setSuit(tempSuit);
        ptr->setRank(tempRank);

        temp = getNode(51-i);
        ptr = ptr->next;
    }

    std::cout << "Cards shuffled.\n" << std::endl;
}
#pragma once
#include "Card.h"
#include <iostream>

class DeckOfCards
{
private: 
    Card *head, *tail; 
    int rank[13] = {1,2,3,4,5,6,7,8,9,10,11,12,13};
    std::string suit[4] = { "Hearts", "Diamonds", "Spades", "Clubs" };

public: 

    DeckOfCards();
    ~DeckOfCards();
    void addNode(int,std::string);
    void createDeck(); 
    void randomSwap();
    void print();
    void shuffleCards();
    Card* getNode(int);
    bool CardExists(int r, std::string s);


};
#include <iostream>
#include "DeckOfCards.h"    
#include "CircularList.h"
#include <ctime>
int main()
{

    srand((unsigned)(time(0)));

    DeckOfCards d; 
    d.createDeck(); 
    d.randomSwap();
    d.shuffleCards();

    return 0;
    temp = ptr;
    ptr->setRank(n->getRank());
    ptr->setSuit(n->getSuit());
    n->setRank(temp->getRank());
    n->setSuit(temp->getSuit());
Card::~Card()
{
    next = NULL; 
    delete next; 
}