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;"という行で失敗するようです。 なぜそれが間違っているのか誰でも知っているかもしれませんか?
['std :: list'](http://en.cppreference.com/w/cpp/container/list)を代わりに使用してください。 –
'getFront'は' front-> next'(リストの2番目の項目へのポインタ)ではなく 'front-> item'(最初の項目の値)を返します。これはあなたを混乱させるかもしれません。 –
@ダーク、あなたは正しい。申し訳ありませんが、私は間違っていました。 –