创建模板队列时出现问题

时间:2013-01-29 10:08:00

标签: c++ templates queue

我正在尝试编写自己的模板队列类来学习如何使用模板。我看到这类问题经常被问到,我已经阅读了很多回复,但我仍然没有看到我做错了什么。

template <class type>
struct Node{
    type data;
    Node *next;
};

template <class type>
class LinkedListQueue{
public:
    LinkedListQueue();
    void push(type new_data);
    void pop();
    type front();
    void print();

private:
    Node<type> *head;
    Node<type> *tail;
};

template <class type>
LinkedListQueue<type>::LinkedListQueue(){
    this->head = NULL;
    this->tail = NULL;
}

template <class type>
void LinkedListQueue<type>::push(type new_data){
    Node<type> *newNode;
    newNode->data = new_data;
    newNode->next = NULL;

    if(this->head == NULL){
        this->head = newNode;
        this->tail = newNode;
    }else{
        this->tail->next = newNode;
        this->tail = newNode;
    }
}

template <class type>
void LinkedListQueue<type>::pop(){
    if(this->head != NULL){
        this->head = this->head->next;
        if(this->head == NULL){
            this->tail == NULL;
        }
    }else{
    cout << "Queue is Empty" << endl;
    }
}

template <class type>
type LinkedListQueue<type>::front(){
    return(this->head->data);
}

int main() {
    LinkedListQueue<int> newQueue;
    newQueue.push(5);
    newQueue.push(4);
    cout << newQueue.front() << endl;
    newQueue.pop();
    cout << newQueue.front() << endl;
}

我无法确定问题所在。如果我注释掉弹出和最后一个前置呼叫,则第一个前()呼叫正确输出。然而,取消注释流行音乐和前端会破坏一切。当我尝试调试pop()时,似乎列表中只有一个Node。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

您没有分配新节点。只是存储数据。

Node<type> *newNode; //<=== indeterminate pointer
newNode->data = new_data;
newNode->next = NULL;

无论如何,你总是推送一个新元素,所以分配它,设置它,然后找出它的去向。此外,为您的节点创建一个构造函数,该构造函数接受数据的const-ref,并将下一个设置为NULL。这使您的代码更加直接(实际上更高效):

Node<type> *newNode = new Node<type>(new_data);

使用Node模板:

template <class type>
struct Node
{
    Node(const type& value) 
        : data(value), next(NULL) {};
    type data;
    Node *next;
};

最后,你的pop()并没有删除节点,只是弄乱了指针。你可能也希望解决这个问题。

template <class type>
void LinkedListQueue<type>::pop()
{
    if(this->head != NULL)
    {
        Node<type>* victim = this->head;
        this->head = this->head->next;
        if(this->head == NULL)
            this->tail == NULL;
        delete victim; // <=== note: deleting node.
    }
    else
    {
        cout << "Queue is Empty" << endl;
    }
}

答案 1 :(得分:0)

这是问题:

Node<type> *newNode;
newNode->data = new_data;

您声明一个指针并直接开始访问它,而不为其分配内存。这意味着指针指向看似随机的位置。导致未定义的行为并且必须预期会发生奇怪的事情。

此外,如果为节点分配内存,则会导致内存泄漏,因为您没有释放pop函数中的节点。