2017-10-21 32 views
-1

我在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

//实施.the代码,我写的。

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

每次我尝试运行它停止工作的程序。

+0

为什么不使用C++的队列stl,为什么你要重新发明wheel dude? –

+1

@Ahmed Samy至少函数void Queue :: Pop()是错误的。例如,这个Front = tmp; 删除tmp; 没有意义。 –

+0

您能否将错误消息添加到您的问题? –

回答

1

成员函数Pop错误。对于初学者来说它删除队列

delete Front; 
Front = tmp; 
delete tmp; 

一次两个节点,它不会在情况下,结果队列调用Pop后空设置Back为0。

功能可以看看下面的方法,因为这个数据成员已经在的构造函数中设置为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冗余节点。

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

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