null オブジェクト モデルを使用して双方向リンク リストを作成しようとしています。ここまでで、リストの先頭にノードを追加するメソッドとノードを表示するメソッドを実装しました。私の問題は、表示機能が常に 0 を表示することです。どこが間違っていて、どのように修正すればよいか誰か指摘できますか? また、ここで null オブジェクト モデルを正しく実装するための正しい軌道に乗っていますか?
注:これは学校の課題です。説明なしで解決策を投稿しないでください。ここで何が起こっているのかを学び、理解したいと思います。
編集:表示の問題を修正した後、私は別のものを持っています:空のリストまたはノードを持つリストで getHead() または getTail() を呼び出すと、 nullNode クラス(空のリストの場合) または elementNode クラス (ノードを持つリストの場合)。これを修正する方法に行き詰まっています。
container.getNext() と container (空のリストの場合) のアドレスを出力すると、両方のアドレスが同じなので、末尾に ->self() を追加して nullNode クラスから self() メソッドを呼び出すべきではありませんか?
class node {
public:
node(){/* Do nothing */}
node(int e){ element = e; }
int getData(){ return element; }
void setData(int e){ element = e; }
friend class list;
protected:
node* getNext(){ return next; }
void setNext(node* n){ next = n; }
node* getPrev() { return prev; }
void setPrev(node* n){ prev = n; }
node* self();
private:
int element;
node* next;
node* prev;
};
class nullNode : public node{
public:
nullNode(){/* Do nothing */}
int getData(){ return NULL; }
void setData(int e){ /* Do Nothing */ }
node* getNext(){ return head; }
void setNext(node* n){ head = n; }
node* getPrev() { return tail; }
void setPrev(node* n){ tail = n; }
node* self(){ return NULL; }
private:
node* head;
node* tail;
};
class elementNode : public node{
public:
elementNode(){/* Do nothing */}
elementNode(int element){
setData(element);
}
int getData(){ return node::getData(); }
void setData(int e){ node::setData(e); }
node* getNext(){ return node::getNext(); }
void setNext(node* n){ node::setNext(n); }
node* getPrev() { return node::getPrev(); }
void setPrev(node* n){ node::setPrev(n); }
node* self(){ return this; }
};
class list{
public:
list();
node* getHead(){ return (container.getNext())->self(); }
node* getTail(){ return (container.getPrev())->self(); }
node* addHeadNode(int e);
void removeNode(node* n);
void insertBefore(node* n, int e);
void insertAfter(node* n, int e);
void displayNode(node *n);
private:
nullNode container;
};
list::list()
{
container.setNext(&container);
container.setPrev(&container);
}
node* list::addHeadNode(int e)
{
node* foo = new elementNode(e);
foo->setPrev(&container);
foo->setNext(container.getNext());
container.getNext()->setPrev(foo);
container.setNext(foo);
return foo;
}
void list::displayNode(node* n)
{
cout << "Node Data: " << n->getData() << endl;
}
int main()
{
list myList;
node* myNode;
myNode = myList.addHeadNode(5);
myList.displayNode(myNode);
return 0;
}