2016-05-27 43 views
0

のDeque、ポインタ、構造体

private: 
    struct DequeNode {     
     Object item; 
     DequeNode *next; 
     DequeNode *prev; 
    }; 
    DequeNode *front; 
    DequeNode *back; 
}; 

私は、データメンバの前面または背面がどうなるか困惑しています。フロントは単にDequeNodeオブジェクトを指すポインタですか?だからフロントにはアイテム、次、または前のアイテムがありませんか?

dequeクラスの実装用です。それはgetFrontメソッドでfront-> nextを返すので、混乱します。私はインプレッションフロントの下にあり、次のメンバーを持たないポインタです。

これは完全なヘッダーです:

template <class Object> 
Deque<Object>::Deque() {       // the constructor 
    front = back = NULL; 
} 

template <class Object> 
Deque<Object>::Deque(const Deque &rhs) {   // the copy constructor 
    front = back = NULL; 
    *this = rhs; 
} 

template <class Object> 
Deque<Object>::~Deque() {       // the destructor 
    clear(); 
} 

template <class Object> 
bool Deque<Object>::isEmpty() const {    // check if a deque is empty 
    return front == NULL; 
} 

template <class Object> 
int Deque<Object>::size() const {     // retrieves # deque nodes 
    int i = 0; 
    for (DequeNode *ptr = front; ptr != NULL; ptr = ptr->next) // traverse que 
    { 
     ++i; 
    } 
    return i; 
} 

template <class Object> 
const Object &Deque<Object>::getFront() const { // retrieve the front node 
    if (isEmpty()) 
     throw "empty queue"; 
    return front->item; 
} 

template <class Object> 
const Object &Deque<Object>::getBack() const { // retrieve the tail node 
    if (isEmpty()) 
     throw "empty queue"; 
    return back->item; 
} 

template <class Object> 
void Deque<Object>::clear() {   // clean up all entries. 
    while (!isEmpty())     // dequeue till the queue gets empty. 
     removeFront(); 
} 

template <class Object> 
void Deque<Object>::addFront(const Object &obj) {// add a new node to front Implement the function body. 

} 

template <class Object> 
void Deque<Object>::addBack(const Object &obj) { // add a new node to tail 
              // Implement the function body. 
} 

template <class Object> 
Object Deque<Object>::removeFront() { // remove the front node 
            // Implement the function body. 
} 

template <class Object> 
Object Deque<Object>::removeBack() { // remove the tail node 
            // Implement the function body. 
} 

template <class Object> 
const Deque<Object> &Deque<Object>::operator=(const Deque &rhs) { // assign 
    if (this != &rhs) { // avoid self assignment 
     clear(); 
     for (DequeNode *rptr = rhs.front; rptr != NULL; rptr = rptr->next) 
      addBack(rptr->item); 
    } 
    return *this; 
} 

私は矢印を使用していることを確認するだけで、単一のオブジェクトを挿入しようとしている。そして、この

#ifndef DEQUE_H 
#define DEQUE_H 
#include <iostream> 

using namespace std; 

template <class Object> 
class Deque { 
public: 
    Deque();         // the constructor 
    Deque(const Deque &rhs);     // the copy constructor 
    ~Deque();         // the destructor 

    bool isEmpty() const;      // checks if a deque is empty. 
    int size() const;       // retrieves # deque nodes 
    const Object &getFront() const;   // retrieve the front node 
    const Object &getBack() const;    // retrieve the tail node 

    void clear();        // clean up all deque entries. 
    void addFront(const Object &obj);   // add a new node to the front 
    void addBack(const Object &obj);   // add a new node to the tail 
    Object removeFront();      // remove the front node 
    Object removeBack();      // remove the tail node 

    const Deque &operator=(const Deque &rhs); // assignment 

private: 
    struct DequeNode {       // a deque node 
     Object item; 
     DequeNode *next; 
     DequeNode *prev; 
    }; 
    DequeNode *front; 
    DequeNode *back; 
}; 

#include "deque.cpp.h" 
#endif 

とcppのですオペレータは正しく表示されますが、これによりセグメント化エラーが発生し続けます。

template <class Object> 
void Deque<Object>::addFront(const Object &obj) {// add a new node to front Implement the function body. 
    if (isEmpty()) // If the deque is empty, just throw the item in there. 
    { 
     front->item = obj; 
     front->next = NULL;  
     front->prev = back; 

     back->next = front;  
     back->item = obj; 
     back->prev = NULL;   
    } 
    else 
    { 
     // Not inserting on an empty list. 
    } 
} 

ただし、セグメンテーションフォルトが発生しています。 print文を追加することで、 "front-> item = obj;"という行で失敗するようです。 なぜそれが間違っているのか誰でも知っているかもしれませんか?

+0

['std :: list'](http://en.cppreference.com/w/cpp/container/list)を代わりに使用してください。 –

+0

'getFront'は' front-> next'(リストの2番目の項目へのポインタ)ではなく 'front-> item'(最初の項目の値)を返します。これはあなたを混乱させるかもしれません。 –

+0

@ダーク、あなたは正しい。申し訳ありませんが、私は間違っていました。 –

答えて

0

フロントとバックは、それぞれ、両端キューと最後のポインタの最初のポインタです。

コメントに記載されているgetFront()メソッドは、その中のデータ(項目)にアクセスする方法を提供します。

実際にはdequeではありません。反復子が定義されていないため、queueのように見えます(提出を明確にするために削除した可能性があります)。

関連する問題