2013-09-29 2 views
5

Мой запрос: почему моя программа придумала ошибку времени выполнения при удалении (фактически, удалении) единственного узла, который я заключил в очередь? Я написал несколько отладочных инструкций в соответствующей функции, которая указывает, что в строке есть что-то неявное:Не удается удалить узел из C++

delete front;

Когда программа выполняет линию, она хочет выйти, потому что она не отвечает мне. Я попробовал

если (передний) удалить передний;

, но безрезультатно. Я попытался найти ответ на Google, но не получил удовлетворительных результатов. Это очень странно. Я занимаюсь ООП уже несколько лет, но это первый для меня. Вот мой код:

=============================== 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

Не думаю, что вам нужны эти 'cout' в 'dequeue()'. Если вы просто делаете это для тестирования, тогда все в порядке. – Jamal

+1

Слишком много ошибок здесь! Альтернативой будет std :: list. –

ответ

6

Ошибка здесь

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

должен быть

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

В вашей версии у вас есть два местных переменные в конструкторе, что просто так, чтобы одни и те же имена, что и переменные в классе , Поэтому ваш конструктор не инициализирует ваш класс вообще.

BTW вы должны войти в привычку использовать инициализатор списки

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

если только Beause этой ошибки не может произойти

BTW это хорошо задаваемый вопрос.

+0

Возможно, компилятор также предупредил об этом. – usr

Смежные вопросы