我正在尝试编写自己的模板队列类来学习如何使用模板。我看到这类问题经常被问到,我已经阅读了很多回复,但我仍然没有看到我做错了什么。
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。
非常感谢任何帮助。
答案 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
函数中的节点。