gpt4 book ai didi

c++ - C++中链表的队列实现

转载 作者:行者123 更新时间:2023-11-30 03:36:07 26 4
gpt4 key购买 nike

我正在尝试基于链表在 C++ 中实现队列容器。我使用相同的结构来实现 Stack,它运行良好。

但现在我对“入队”方法遇到了麻烦。我不明白到底是什么问题,虽然我知道指针是我的弱点。

#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;
}

我没有收到任何错误,但是当我运行它时我收到“段错误”。

最佳答案

在函数中的这个循环之后

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++ - C++中链表的队列实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40834019/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com