2013-09-26 2 views
0

Я пытаюсь выполнить глубокую копию для своей очереди (FIFO) с использованием узлов, и я получаю сообщение об ошибке и не знаю, что вызывает его. Все методы работают нормально, когда я ничего не копирую, но как только я пытаюсь копировать, я получаю сообщение «MyQueue.exe», перестало работать. Это происходит, когда я даже не использую методы. Это также происходит, даже если я прокомментирую весь цикл do-while. Кто-нибудь знает, что вызывает это?Глубокое копирование очереди с использованием ошибки времени выполнения узла

MyQueue::MyQueue (void) 
{ 
    head = NULL; 
    queueSize = 0; 
} 

MyQueue::MyQueue (const MyQueue & myq) 
{ 
    copyQueue (myq); 

} 

MyQueue & MyQueue::operator = (const MyQueue & myq) 
{ 

    copyQueue (myq); 
    return *this; 

} 

void MyQueue::copyQueue (const MyQueue & myq) 
{ 
    head = NULL; 
    queueSize = 0; 
    Node* temp = myq.head->next; 
    do 
    { 
     enqueue(myq.head->data); 
     temp = temp->next; 
    } 
    while (temp->next != NULL); 

} 

MyQueue::~MyQueue (void) 
{ 

} 

void MyQueue::enqueue (const int n) 
{ 
    Node* temp = tail; 
    tail = new Node (n); 
    queueSize++; 
    if (empty()) 
    { 
     head = tail; 

    } 
    else 
    { 

     temp->next = tail; 

    } 

} 

int MyQueue::dequeue (void) 
{ 
    if (!empty()) 
    { 
     int result = head->data; 
     Node* temporary = head; 
     head = (temporary->data, temporary->next); 
     queueSize--; 
     return result; 

    } 
    else 
    { 
     std::cout << "No Items to remove" << std::endl; 
     return NULL; 
    } 

} 

int MyQueue::peek (void) 
{ 
    return head->data; 
} 



bool MyQueue::empty (void) 
{ 
    if (head == NULL || queueSize == 0) 
    { 
     return true; 
    } 

    return false; 
} 

Это как мой узел копируется

Node & Node::operator = (const Node* & nd) 
     { 
      data = nd->data; 
      next = nd->next; 
     } 
+0

Можно ли задать [минимальный полный пример] (http://sscce.org), чтобы спросить? – Beta

+0

С кодом есть несколько проблем. Назначение 'Node' не является глубоким заданием. Ваш 'copyQueue()' копирует первый элемент входной очереди несколько раз, вместо копирования каждого члена очереди. Ваш 'dequeue()' не удаляет память, выделенную в 'enqueue()'. Вероятно, ваш сбой произошел из-за NULL разыменования в состоянии 'while' вашего метода copyQueue(). – jxh

ответ

0
MyQueue q1; 
MyQueue q2 = q1; // Crash. 

Это приведет к краху, потому что head является NULL, и вы разыменования его в методе copyQueue().

Node* temp = myq.head->next; 
Смежные вопросы