2017-10-15 6 views
0

なぜループは3回ですか?ノード構造のためループループの場合のみ3回

#ifndef QUEUE_H 
#define QUEUE_H 

#include "Node.h" 
#include <stdexcept> 

template<class T> 
class Queue 
{ 
public: 
    Queue() 
    { 
     this->FirstElement = nullptr; 
     this->LastElement = nullptr; 
    } 

    void Enqueue(T value) 
    { 
     if (0 == Size()) 
     { 
      FirstElement = new Node<T>(value); 
      LastElement = FirstElement; 
     } 
     else 
     { 
      LastElement->Previous = new Node<T>(value); 
      LastElement = LastElement->Previous; 
     } 
    } 

    T Dequeue() 
    { 
     if (0 == Size()) 
     { 
      throw std::out_of_range("Out of range ! Empty stack !"); 
     } 

     T element(FirstElement->Value); 

     if (nullptr != FirstElement->Previous) 
     { 
      Node<T>* temp = FirstElement->Previous; 
      delete FirstElement; 
      FirstElement = temp; 
     } 
     else 
     { 
      delete FirstElement; 
      FirstElement = nullptr; 
      LastElement = nullptr; 
     } 

     return element; 
    } 

    int Size() 
    { 
     int queueSize = 0; 
     Node<T>* element = FirstElement; 

     if (nullptr != FirstElement) 
     { 
      while (nullptr != FirstElement->Previous) 
      { 
       ++queueSize; 
      } 

      ++queueSize; //Uwzglednienie ostatniego elementu, ktory nie jest policzony w petli 
     } 

     return queueSize; 
    } 

private: 
    Node<T>* FirstElement; 
    Node<T>* LastElement; 
}; 
#endif // !QUEUE_H 

とコード:

#ifndef NODE_H 
#define NODE_H 

template<class T> 
struct Node 
{ 
public: 
    Node(T value) 
    { 
     this->Previous = nullptr; 
     this->Value = value; 
    } 

    Node<T>* Previous; 
    T Value; 
}; 
#endif // !NODE_H 

そして、ここで私は3 に等しく、ここではキュークラスのコードであるとき、forループ

for (size_t i = 0; i < 10; i++) 
{ 
    std::cout << "Dodany element kolejki: " << i << std::endl; 
    queue.Enqueue(i); 
} 

常に破ります

Dodany element kolejki: 0 
Dodany element kolejki: 1 
Dodany element kolejki: 2 

ループのエンキューメソッドの呼び出しを10回削除します。コンパイラや例外がスローされたり、その他のエラーが発生したりすることはありません。これは何らかの理由で3回ループしただけです。

+2

。 – Ron

答えて

1

プログラムはループ反復3で停止せず、むしろ3回反復した後に停止します。 これは、Queue :: Size()関数が無限ループに入っているように思われるためです。

私はあなたのようなものにするためにサイズを意味だと思う:[、最小完全、かつ検証例]を提供(https://stackoverflow.com/help/mcve)してください

int Size() 
{ 
    int queueSize = 0; 
    Node<T>* element = FirstElement; 

    if (nullptr != FirstElement) 
    { 
     while (nullptr != element->Previous) 
     { 
      element = element->Previous; 
      ++queueSize; 
     } 
     ++queueSize; 
    } 
    return queueSize; 
} 
関連する問題