2013-02-22 8 views
1

所以我的代碼下面的代碼片段...C++出隊的問題...離隊返回相同的元素反覆

for(int k=0; k<10; k++){ 
    State newState; 
    newState = queue.dequeue(); 
    //...do stuff with `newState`... 
} 

我遇到的問題是,測試了幾個小時之後,我意識到,newState出隊每次代碼到達newState = queue.dequeue()時,都會出現State的完全相同的實例,而不是以FIFO方式彈出新元素......我似乎無法弄清楚我究竟做錯了什麼:/

下面是我的隊列類.h和.cpp代碼...

//queue.h 

#include <iostream> 
#include <stdio.h> 

#include "state.h" 

using namespace std; 

// Node class 
class Node { 
public: 
    State elem; 
    Node* next; 
    Node() {} 
    State Elem() { return elem; } 
    Node* Next() { return next; } 
}; 

// Queue class 
class Queue { 
    Node *head; 
    Node *tail; 
    public: 
    Queue(); 
    ~Queue(); 
    bool isEmpty(); 
    int size(); 
    void enqueue(State); 
    State dequeue(); 
}; 

和我的.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; 
    } 
} 

在此先感謝您的幫助,我很樂意展示每個請求我的代碼的任何其他片段

編輯:這是我的複製構造國家...

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; 
} 
+1

不是你的問題的答案,而是:你的程序邏輯與'Queue'的實現緊密結合。將'Queue'作爲模板類而不是對其進行硬編碼以保存'State's是有意義的。解決這個難題的邏輯也不應該在容器內完成,而應該在使用容器的代碼中完成。如果你將這些東西分開,也許你會發現更容易調試。 – jrok 2013-02-22 10:04:15

+1

我在'Queue'代碼中看不到任何錯誤。也許'State'的拷貝構造函數有問題? – Angew 2013-02-22 10:05:27

+0

是的,我知道。我應該改變這一點。由於這個程序在12小時內到期,所以我開始進行一些編碼馬拉松比賽,所以我開始變得有些sl。。但從我的測試來看,入隊似乎很好。大小應該增加。我認爲這與我分配newState的方式有關,但我不確定... – 2013-02-22 10:07:09

回答

0

size()

delete temp; 

雖然沒有危險,但因爲此時temp爲空,所以看起來很可疑。您還可以刪除if/else,因爲count在head爲空時不會增加。

否則我不明白爲什麼它應該一次又一次地返回相同的元素。唯一的原因可能是一些代碼,它會多次插入相同的元素。