C++ 在while循环中将布尔值更改为true?C++;
我有一副单链表中的卡片。我试图随机交换没有重复的值。为此,我向每个节点添加了一个布尔变量“used”,并将其设置为false。每当我使用这些卡时,我都会将其更新为true,以便不再使用它们。我试图添加一个while循环,以确保没有使用过的卡被交换。但是,一旦启动while循环,每个节点使用的变量都将设置为true,因此while循环永远不会中断。我已经在while循环之前打印了使用过的变量值,它们都设置为false。感谢您的帮助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() {
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
没有任何作用。那么此析构函数的用途是什么呢?我们需要查看卡片类。这很可能是由于未初始化的变量。我的水晶球告诉我们megetNode
更改值。我添加了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;
}