簡體   English   中英

在C ++中使用鏈接列表進行隊列實現

[英]Queue implementation with Linked list in C++

我正在嘗試基於鏈接列表在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++;
}

為了使隊列更有效率,最好根據雙面列表來實現它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM