对于循环循环仅 3 次

For loop loops only 3 times

本文关键字:循环 于循环      更新时间:2023-10-16

为什么循环只有 3 次?

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

当 i 等于 3 时,for 循环总是中断。这是队列类的代码:

#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

这是输出:

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

当我删除循环的排队方法的调用 10 次时。没有来自编译器的警告或引发的异常或任何其他任何类型的错误。由于某种原因,它只是循环了 3 次。

您的程序不会在循环迭代 3 处停止,而是在 3 次迭代后挂起。这很可能是由于 Queue::Size() 函数似乎进入了一个无限循环。

我想你的意思是大小是这样的:

int Size()
{
    int queueSize = 0;
    Node<T>* element = FirstElement;
    if (nullptr != FirstElement)
    {
        while (nullptr != element->Previous)
        {
            element = element->Previous;
            ++queueSize;
        }
        ++queueSize;
    }
    return queueSize;
}