C++的排队问题…dequeue重复返回相同的元素

C++的排队问题…dequeue重复返回相同的元素,c++,linked-list,queue,C++,Linked List,Queue,所以我有下面的代码片段 for(int k=0; k<10; k++){ State newState; newState = queue.dequeue(); //...do stuff with `newState`... } 和我的.cpp文件 //queue.cpp #include "queue.h" #include <iostream> Queue::Queue(){ head = NULL; tail = NULL

所以我有下面的代码片段

for(int k=0; k<10; k++){
    State newState;
    newState = queue.dequeue();
    //...do stuff with `newState`...
}
和我的.cpp文件

//queue.cpp

#include "queue.h"

#include <iostream>

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

Queue::~Queue(){
    if(!isEmpty()){
        while(head){
            Node *del = head;
            head = head->next;
            delete del;
        }
    }
}

bool Queue::isEmpty(){
    return head == NULL;
}

int Queue::size(){
    int count = 0;
    if(isEmpty()){
        return count;
    } else {
        Node *temp = head;
        while(temp){
            temp = temp->next;
            count++;
        }
        delete temp;
        return count;
    }
}

//insert s to back of queue
void Queue::enqueue(State s){
    Node* newNode = new Node();
    newNode->elem = s;
    newNode->next = NULL;
    if(s.checkZ()){
        cout << "Puzzle solved!" << endl << endl;
        exit(0);
    }
    if(head==NULL){
        head = tail = newNode;
    } else {
        tail->next = newNode;
        tail = newNode;
    }
}

//remove State from front of queue
State Queue::dequeue(){
    if(isEmpty()){
        cout << "This puzzle has no solution." << endl;
        cout << "Exiting program..." << endl << endl;
        exit(0);
    } else {
        State ret = head->Elem();
        Node *del = head;
        head = head->next;
        delete del;
        return ret;
    }
}
大小

虽然不危险,但由于temp在这一点上为空,因此看起来可疑。您还可以删除if/else,因为当head为null时,计数不会增加


否则,我看不出为什么它会一次又一次地返回相同的元素。唯一的原因可能是一些代码,它多次插入相同的元素。

这不是对您的问题的回答,而是:您的程序逻辑与队列的实现紧密耦合。将队列作为模板类而不是硬编码以保存状态是有意义的。解决这个难题的逻辑也不应该在容器内部完成,而应该在使用容器的代码中完成。如果你把这些东西分开,也许你会发现调试起来更容易。我看不出队列代码中有任何错误。也许州政府的复制构造函数有问题?是的,我知道。我应该改变这一点。我一直在进行一场编码马拉松,因为这个程序将在12小时后到期,所以我开始有点马虎。但从我的测试来看,排队似乎效果不错。大小应该是递增的。我认为这与我分配newState的方式有关,但我不确定…也不是答案,但为什么不使用std::queue来代替呢?好的,我用状态的复制构造函数更新了原始问题。。。对于这个任务,我们必须从头开始创建所有的数据结构。
//queue.cpp

#include "queue.h"

#include <iostream>

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

Queue::~Queue(){
    if(!isEmpty()){
        while(head){
            Node *del = head;
            head = head->next;
            delete del;
        }
    }
}

bool Queue::isEmpty(){
    return head == NULL;
}

int Queue::size(){
    int count = 0;
    if(isEmpty()){
        return count;
    } else {
        Node *temp = head;
        while(temp){
            temp = temp->next;
            count++;
        }
        delete temp;
        return count;
    }
}

//insert s to back of queue
void Queue::enqueue(State s){
    Node* newNode = new Node();
    newNode->elem = s;
    newNode->next = NULL;
    if(s.checkZ()){
        cout << "Puzzle solved!" << endl << endl;
        exit(0);
    }
    if(head==NULL){
        head = tail = newNode;
    } else {
        tail->next = newNode;
        tail = newNode;
    }
}

//remove State from front of queue
State Queue::dequeue(){
    if(isEmpty()){
        cout << "This puzzle has no solution." << endl;
        cout << "Exiting program..." << endl << endl;
        exit(0);
    } else {
        State ret = head->Elem();
        Node *del = head;
        head = head->next;
        delete del;
        return ret;
    }
}
State::State(const State &rhs){
    pieces = rhs.pieces;
    pieceCount = rhs.pieceCount;
    rows = rhs.rows; cols = rhs.cols;
    currentState = rhs.currentState;
    prevStates = rhs.prevStates;
    prevStateCount = rhs.prevStateCount;
    moves = rhs.moves;
    moveCount = rhs.moveCount;
}
delete temp;