2017-10-21 103 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會更符合邏輯。