2013-09-29 2 views
5

내 쿼리 : 대기열에서 대기중인 유일한 노드를 대기열에서 풀 때 (실제로는 삭제 중일 때) 내 프로그램에서 런타임 오류가 발생하는 이유는 무엇입니까? 적절한 함수에 디버깅 문을 작성했습니다.이 함수는 행에 문제가 있음을 나타냅니다.C++에서 노드를 dequeue 할 수 없습니다.

delete front;

프로그램이 줄을 실행할 때 응답하지 않기 때문에 종료하려고합니다. 시도했습니다

(앞면) 삭제 앞면;

그러나 아무 소용이 없습니다. Google에서 답변을 찾으려고했지만 만족스러운 결과를 얻지 못했습니다. 이것은 매우 이상합니다. 나는 몇 년 동안 OOP를 다루었지만 그게 내가 처음이다. 여기 내 코드는 다음과 같습니다.

===================== Queue.cpp ====== =================

#include <iostream> 
#include "Queue.h" 
using namespace std; 

Queue::Queue() 
{ 
    QueueNode * front = NULL; 
    QueueNode * rear = NULL; 
} 

Queue::~Queue() 
{ 
    while(rear) dequeue(); 
} 

void Queue::enqueue(int row, int col) 
{ 
    // create the child state: 
    QueueNode * newNode; 
    newNode = new QueueNode; 

    // write in child state's coordinates: 
    newNode->row = row; 
    newNode->col = col; 

    // enqueue the child state: 
    if(!front) // if empty, new is front 
    { 
     // first node = front and back 
     front = newNode; 
     rear = newNode; 
    } 
    else // not the first node: 
    { 
     newNode->next = rear; // new points to back 
     rear = newNode; // new is the back 
    } 
} 

void Queue::dequeue() 
{ 
    cout << "\nHere\n"; 
    delete front; 
    cout << "\nHere 2\n"; 
    front = rear; 
    cout << "\nHere 3\n"; 
    while(front->next) front = front->next; 
    cout << "\nHere 4\n"; 
} 

========== =============== Queue.h ====================== ===============

#ifndef QUEUE_H 
#define QUEUE_H 

class Queue 
{ 
    public: 
     struct QueueNode 
     { 
      // numbers: 
      int row; 
      int col; 

      QueueNode * next; 
     }; 

     QueueNode * front; 
     QueueNode * rear; 

     Queue(); 
     ~Queue(); 

     void enqueue(int, int); 
     void dequeue(); 
     //void traverse(); // scan for repetition of location. 
     //void displayQueue() const; 
}; 

#endif 

참고 : 그 탭의 대체 많이 걸릴 것 때문에 메인 드라이버의 코드를 포함하지 않았다

1) 4 칸.

2) 대기열 노드를 하나만 대기열에 추가했습니다.

3) 문제가 무엇인지 알아 내야 만했기 때문에 큐 클래스에서 모든 것을 공개했습니다. 당분간은 그렇게 할 것입니다.

4) 이것은 내가 StackOverflow.com에서 질문하는 것이 처음이므로, 내가 잘못하면, 아직도 배우고 있습니다.

5) Visual C++ 2008 Express Edition을 사용하고 있습니다.

또 다시 쿼리 : 큐에서 유일한 노드를 삭제할 때 프로그램에서 런타임 오류가 발생하는 이유는 무엇입니까?

+0

나는'dequeue()'에서'cout'을 필요로하지 않는다고 생각합니다. 테스트 목적으로 그 일을하고 있다면 괜찮습니다. – Jamal

+1

너무 많은 버그가 있습니다! std :: list가 대안이 될 수 있습니다. –

답변

6

오류는 단지 클래스의 변수와 같은 이름이 일이 당신의 생성자에 두 개의 지역 변수가

Queue::Queue() 
{ 
    QueueNode * front = NULL; 
    QueueNode * rear = NULL; 
} 

이 버전에서

Queue::Queue() 
{ 
    front = NULL; 
    rear = NULL; 
} 

해야 여기에있다 . 그래서 생성자가 클래스를 초기화하지 않습니다. 단이 실수 beause

일어날 수없는 경우

BTW 당신은 ​​BTW이 잘 묻는 질문 목록

Queue::Queue() : front(NULL), rear(NULL) 
{ 
} 

을 initialiser 사용하는 습관을해야한다.

+0

아마도 컴파일러는 이것에 대해서도 경고했습니다. – usr

관련 문제