队列实现,带有C 中的链接列表

Queue implementation with Linked list in C++

本文关键字:链接 列表 实现 带有 队列      更新时间:2023-10-16

我正在尝试基于链接列表在C 中实现队列容器。我使用相同的结构来实现堆栈,并且效果很好。

,但是现在我在方法"入口"方面已经麻烦了。我不明白问题到底是什么,尽管我知道指针是我的弱点。

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

使队列更有效,最好是根据双面列表实施。