1

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

3 に答える 3

0

問題は隠れています

elementNode(int element){
    node e;
    e.setData(element);
}

ここで何が起こっているのですか?最初にクラスのインスタンスを作成し、次にそのメンバー関数nodeを呼び出します。setData確かeに の値で変更されますelementが、次の瞬間にeとの両方が存在しなくなります。これは、 の情報がどこにも保存されていない間に、element初期化されたスコープが最後まで終了した ( によって終了した) ためです。}element

ただし、上記のコードを

elementNode(int element){
    setData(element);
}

継承されたsetDataメンバー関数を呼び出し、の値elementが保存され、プログラム5は期待どおりに出力されます。

于 2012-07-15T17:36:23.487 に答える
0

elementNodeコンストラクターはその部分を初期化しようとしていますnode:

elementNode(int element){
  node e;
  e.setData(element);
}

実際には、無関係なノードを構築してから破棄するだけです。

必要なのは、サブクラス コンストラクターの初期化リストで実行できるスーパークラス コンストラクターを呼び出すことです。

elementNode(int element) : node(element) {
}
于 2012-07-15T17:38:10.887 に答える
0
elementNode(int element)
{
    node e;
    e.setData(element);
}

このコードは何をしていますか? nodeeを作成しますが、その後破棄され、どのリストにも追加されないように見えます。

于 2012-07-15T17:28:29.583 に答える