2015-12-19 22 views
1

我试图使用链表来实现队列,但是当我传递给enqueue功能的整数main错误在我的队列datastructres实施

抛出异常,我得到这个错误:写访问冲突。

this-> tail was nullptr。

这里是我的Queue.h

#include <iostream> 
using namespace std; 

template <class T > 
class Node 
{ 
public: 
    T data; 
    Node* next; 
    Node(); 
    Node(T _data); 
}; 

template <class T> 
class Queue 
{ 

public: 
    Node<T> *head, *tail; 
    int elemsCnt; 
    Queue(); 
    ~Queue(); 
    int count(); 
    void clear(); 
    void enqueue(T); 
    T dequeue(); 
    T front(); 
    T back(); 
    bool empty(); 
}; 

,这是我Queue.cpp我写的功能.. 的#include “Queue.h”

template <class T> 
Node<T>::Node() 
{ 
    next = NULL; 
} 

template <class T> 
Node<T>::Node(T _data) 
{ 
    data = _data; 
    next = NULL; 
} 

template <class T> 
Queue<T>::Queue() 
{ 
    head = tail = NULL; 
    elemsCnt = 0; 
} 

template <class T> 
Queue<T>::~Queue() 
{ 
    clear(); 
} 

template <class T> 
int Queue<T>::count() 
{ 
    return elemsCnt; 
} 

template <class T> 
bool Queue<T>::empty() 
{ 
    return(elemsCnt == 0); 
} 

template <class T> 
void Queue<T>::enqueue(T val) 
{ 
    Node<T>* inserted = new Node<T>(val); 
    tail->next = inserted; 
    tail = inserted; 
    ++elemsCnt; 
} 

template <class T> 
T Queue<T>::dequeue() 
{ 
    Node<T>* deleted = head; 
    T val = head->data; 
    head = head->next; 
    delete deleted; 
    --elemsCnt; 

    if (empty()) 
     tail = NULL; 

    return val; 
} 

template <class T> 
T Queue<T>::front() 
{ 
    return head->data; 
} 

template <class T> 
T Queue<T>::back() 
{ 
    return tail->data; 
} 

template <class T> 
void Queue<T>::clear() 
{ 
    while (!empty()) 
    { 
     Node<T>* deleted = head; 
     head = head->next; 
     delete deleted; 
     --elemsCnt; 
    } 
    tail = NULL; 
} 

回答

0

因为最初你的队列是空的。当你有:

void Queue<T>::enqueue(T val) 
{ 
    Node<T>* inserted = new Node<T>(val); 
    tail->next = inserted; //at this point tail is still NULL 
    //it is illegal to try to access * and . on NULL 

    tail = inserted; 
    ++elemsCnt; 
} 

,如果你要修复它试试这个:

void Queue<T>::enqueue(T val) 
{ 
    Node<T>* inserted = new Node<T>(val); 

    if(this->elemsCnt==0) 
    { 
     //empty Queue 
     this->head=inserted; 
     this->tail=inserted; 
    } 
    else 
    { 
     //non empty 
     inserted->next=this->head; //make sure the new head can point to older head 
     this->head=inserted; update the pointer for head. 

    } 
    ++elemsCnt; 
} 
+0

好的如何解决这个问题? – zod101

+0

对于一个队列,你并不需要尾巴,所以不要太担心它。如果你的队列是空的,tail是NULL,否则它是最后一个元素。对队列没有用处。 – ForeverStudent

0

就像例外说,尾为NULL。当列表为空时(head == tail == null),enqueue方法不处理这种情况。

template <class T> 
void Queue<T>::enqueue(T val) 
{ 
    Node<T>* inserted = new Node<T>(val); 
    if (head == NULL) 
    { 
     head = tail = inserted; 
    } 
    else 
    { 
     tail->next = inserted; 
     tail = inserted; 
    } 
    ++elemsCnt; 
} 
+0

我试了这个,仍然给我同样的错误 – zod101

+0

将不得不看到排队/出队序列,因为逻辑看起来是正确的。我刚才注意到,在出列和清除时,当最后一项被移除时,您不会将头部设置为空和尾部。所以,如果你入队,出队,然后再入队,我可以看到这个异常。 – DBug