在我的代码中找不到链表的队列中的错误

时间:2017-10-21 10:14:47

标签: c++ data-structures queue

我在3个文件“Source.cpp,Queue.h,Queue.cpp”中编写了代码。

每次运行程序时,都显示错误,我不知道原因。包括所有需要的库。

// Source.Cpp“主要功能”

Queue<int>X;
 //trying to run the program .
for ( int i = 0; i < 5; i++)
{
    X.Push(i + 1);
    cout << X.Size() << endl;
}
X.front();/
X.Pop();
X.front();
X.Pop();


return 0;

// Queue.h

//节点类.header文件,包含所有函数。

template<class Mine>
class Node
{
public:
    Mine Value;
    Node<Mine> *Prev;
    Node();
    Node(Mine );
};

template<class Mine>
  //Queue Class 
class Queue
{
    int Elements;
    Node<Mine> *Front, *Back;

public:
    Queue();
    ~Queue();
    int Size();//returns Queue Size
    void Push(Mine );//Push a new value to the  back
    void Pop();//removes a value from the front
    void Clear();// delete  all the elements
    bool isEmpty();// checks if there are no elements in the queue
    Mine front();//returns the value in the front

 };

// Queue.cpp

//实现。我写的代码。

template<class Mine>
Node<Mine>::Node()
{
Value = 0;
Prev = 0;
}

template<class Mine>
Node<Mine>::Node(Mine Value)
{
this->Value = Value;
Prev = 0;
}

template<class Mine>
 Queue<Mine>::Queue()
 {
 Elements = 0;
 Front = Back = 0;
 }

 template<class Mine>
 Queue<Mine>::~Queue()
 {
 Clear();
 }

template<class Mine>
int Queue<Mine>::Size()
{
 return Elements;
}

template<class Mine>
void Queue<Mine>::Push(Mine Value) 
 {
 Node<Mine> *NEW = new Node<Mine>(Value);
 if (Front==0)
   {
    Front = Back = NEW;
    Back->Prev = 0;
    }
 else
   {
    Back->Prev=NEW;
    Back = NEW;
    Back->Prev = 0;
    }
  Elements++;
 }

template<class Mine>
void Queue<Mine>::Pop()
{
Node<T>*tmp;
assert(!isEmpty());
tmp = Front->Prev;
delete Front;
Front = tmp;
delete tmp;

if ( Elements==1)Front=Back;
Elements--;

}
  template<class Mine>
  void Queue<Mine>::Clear() 
   {
    for (int i = 0; i < Elements; i++)
     {
       Pop();
     }
   }
  template<class Mine>
  bool Queue<Mine>::isEmpty() 
  {
  return Elements == 0;
  }
  template<class Mine>
  Mine Queue<Mine>::front() 
  {
     assert(!isEmpty());
    return Front->Value;
  }

每当我尝试运行该程序时,它就会停止工作。

1 个答案:

答案 0 :(得分:1)

成员函数Pop错误。对于初学者,它会立即删除队列中的两个节点

delete Front;
Front = tmp;
delete tmp;

并且在调用Back后结果队列为空时,它不会将Pop设置为0.。

该功能可以按以下方式查看

template<class Mine>
void Queue<Mine>::Pop()
{
    assert(!isEmpty());

    Node<T> *tmp = Front->Prev;
    delete Front;

    Front = tmp;

    if ( --Elements == 0 ) Back = nullptr;
}

也是这样的陈述

Back->Prev = 0;

在成员函数Push中是多余的,因为该数据成员已在节点的构造函数中设置为0.

从设计的角度来看,类Node应该是类Queue的内部私有结构,因为它是类Queue的实现细节。

将数据成员Prev重命名为Next会更符合逻辑。