C++中链表的队列实现
Queue implementation with Linked list in C++
我正在尝试基于链表在 C++ 中实现队列容器。我使用相同的结构来实现 Stack,它运行良好。
但是现在我对方法 "enqueue" 有问题。我不明白到底是什么问题,虽然我知道指针是我的弱点。
#include <iostream>
template <class N>
class node {
public:
N data;
node* next;
};
template <class Q>
class my_queue {
protected:
node<Q>* m_head;
unsigned int m_size;
public:
my_queue() {
m_head = NULL;
m_size = 0;
}
void enqueue(Q value) {
node<Q>* newel = new node<Q>; // creating the new element
node<Q>* last = m_head; // find the last element in the queue
while(last != NULL) {
last = last->next;
}
newel->data = value;
newel->next = last->next;
last->next = newel;
m_size++;
}
void print() {
node<Q>* element = m_head; // element == each element in the list
while(element != NULL) {
std::cout << element->data << std::endl;
element = element->next;
}
}
};
如果我编译它:
main() {
my_queue<int> q;
q.enqueue(1);
q.enqueue(2);
q.enqueue(3);
q.enqueue(4);
q.enqueue(5);
q.print();
return 0;
}
我没有得到任何错误,但是当我 运行 它时,我得到 "Segmentation fault"。
函数中的这个循环之后
while(last != NULL) {
last = last->next;
}
指针 last
将始终等于 NULL
。因此,由于这些语句,该函数具有未定义的行为
newel->next = last->next;
last->next = newel;
函数可以改写成下面的方式
void enqueue( const Q &value )
{
node<Q> *newel = new node<Q> { value, nullptr };
if ( m_head == nullptr )
{
m_head = newel;
}
else
{
node<Q> *last = m_head; // find the last element in the queue
while ( last->next != nullptr ) last = last->next;
last->next = newel;
}
m_size++;
}
为了使队列更有效率,最好基于双向列表来实现它。
我正在尝试基于链表在 C++ 中实现队列容器。我使用相同的结构来实现 Stack,它运行良好。
但是现在我对方法 "enqueue" 有问题。我不明白到底是什么问题,虽然我知道指针是我的弱点。
#include <iostream>
template <class N>
class node {
public:
N data;
node* next;
};
template <class Q>
class my_queue {
protected:
node<Q>* m_head;
unsigned int m_size;
public:
my_queue() {
m_head = NULL;
m_size = 0;
}
void enqueue(Q value) {
node<Q>* newel = new node<Q>; // creating the new element
node<Q>* last = m_head; // find the last element in the queue
while(last != NULL) {
last = last->next;
}
newel->data = value;
newel->next = last->next;
last->next = newel;
m_size++;
}
void print() {
node<Q>* element = m_head; // element == each element in the list
while(element != NULL) {
std::cout << element->data << std::endl;
element = element->next;
}
}
};
如果我编译它:
main() {
my_queue<int> q;
q.enqueue(1);
q.enqueue(2);
q.enqueue(3);
q.enqueue(4);
q.enqueue(5);
q.print();
return 0;
}
我没有得到任何错误,但是当我 运行 它时,我得到 "Segmentation fault"。
函数中的这个循环之后
while(last != NULL) {
last = last->next;
}
指针 last
将始终等于 NULL
。因此,由于这些语句,该函数具有未定义的行为
newel->next = last->next;
last->next = newel;
函数可以改写成下面的方式
void enqueue( const Q &value )
{
node<Q> *newel = new node<Q> { value, nullptr };
if ( m_head == nullptr )
{
m_head = newel;
}
else
{
node<Q> *last = m_head; // find the last element in the queue
while ( last->next != nullptr ) last = last->next;
last->next = newel;
}
m_size++;
}
为了使队列更有效率,最好基于双向列表来实现它。