0

二重リンク リストのノードをいくつか作成して出力しようとしています。そこで、dnode クラスを作成します。

template <typename T>
class dnode
{
    public:
        T nodeValue;
        dnode<T> *prev;
        dnode<T> *next;

        dnode() : prev(this), next(this) {}

        dnode(const T& item, dnode<T> *prevNode = NULL, dnode<T> *nextNode = NULL) :
            nodeValue(item), prev(prevNode), next(nextNode) {}

};

それから私は私の writeList 関数を持っています:

template <typename T>
void writeDLinkedList(dnode<T>* header, const string& seperator = " ")
{
    dnode<T> *p = header->next;

    while (p != header)
    {
        cout << p->nodeValue << seperator;
        p = p->next;
    }

    cout << endl << endl;
}

主に、ヘッダー ポインターと 2 つのノードを作成し、コンストラクターを使用して循環リスト内の前後のノードを割り当てます。

dnode<int> *header, *one, *two;

header = new dnode<int>(0, two, one);
one = new dnode<int> (10, header, two);
two = new dnode<int> (25, one, header);

writeDLinkedList(header);

writeDLinkedList を呼び出すと、セグメンテーション違反が発生します。私はこれに混乱したので、最終的に各ノードの値を個別に出力して、ポインターが正しく機能しているかどうかを確認しようとしました。そうではなかったことが判明しました。代わりに、印刷機能を正しく動作させるためにこれを行う必要があります。

header = new dnode<int>;

one = new dnode<int> (10);
two = new dnode<int> (25);
header->next = one;
one->next = two;
two->next = header;

writeDLinkedList(header);

コンストラクターが正常に動作しない理由を知りたいです。初期化リストですか?

4

3 に答える 3

1

コンストラクターは機能しています。問題は、値が与えられる前に変数を使用していることです。

dnode<int> *header, *one, *two; 
// one and two have undefined values at this point

header = new dnode<int>(0, two, one);
// so undefined values get put into header->next and header->prev

双方向にリンクされたリストでは、ポインター サイクルがあり、ノード A はノード A を指すノード B を指します。定義により、ポインター サイクルはコンストラクターのみで作成することはできません。ノード A またはノード B のいずれかを最初に作成する必要があるためです。最初に作成されたものは、他のノードがまだ存在しないため、他のノードを指して作成することはできません。

二重連結リストは、私が思っているよりも少し複雑です。

于 2013-04-23T21:36:27.770 に答える
0

二重循環リストを作成しようとしていると思います。最初に個々のノードを作成してから、それらを接続できます。2 つのノードを接続した後の二重循環リストでは、最後のノードを最初のノードに接続して円を閉じる必要があります。のようなものを試してみてください。私は int のためにそれをしましたが、テンプレートに簡単に入れることができます。

#include<iostream>

class dnode
{

public:

    dnode(int a):prev(this), next(this), nodeValue(a)
     {}
    void connectNode(dnode *newNode)
     {
        if(newNode != NULL)
        {
            dnode*head = this->next;
            this->next = newNode;
            newNode->prev = this;
            newNode->next = head;
            head->prev = newNode;
        }
     }

    void writeDNode()
     {
     dnode *p = this->next;
        while(p != this)
         {
            std::cout<<"Element "<<p->nodeValue<<std::endl;
            p = p->next;
         }
     }
private:
    int nodeValue;
    dnode *prev;
    dnode *next;

 };


int main(int argc, char*argv[])
 {
    dnode* header = new dnode(-1);
    dnode *one = new dnode(23);
    dnode *two = new dnode(45);
    dnode *three = new dnode(67);
    header->connectNode(one);
    one->connectNode(two);
    two->connectNode(three);
    header->writeDNode();
    std::getchar();



 }
于 2013-04-23T22:27:46.757 に答える
0

ノードを正しく管理していません。代わりにこれを試してください:

template <typename T>
class dnode
{
    public:
        T nodeValue;
        dnode<T> *prev;
        dnode<T> *next;

        dnode() : prev(NULL), next(NULL) {}

        dnode(const T& item, dnode<T> *prevNode = NULL) :
            nodeValue(item), prev(prevNode), next(NULL)
        {
            if (prev)
            {
                if (prev->next)
                    prev->next->prev = this;
                prev->next = this;
            }
        }

        ~dnode()
        {
            if (prev)
                prev->next = next;

            if (next)
                next->prev = prev;
        }
};

.

template <typename T>
void writeDLinkedList(dnode<T>* header, const string& seperator = " ")
{
    dnode<T> *p = header;

    while (p != NULL)
    {
        cout << p->nodeValue << seperator;
        p = p->next;
    }

    cout << endl << endl;
}

.

dnode<int> *header, *one, *two;

header = new dnode<int>(0);
one = new dnode<int> (10, header);
two = new dnode<int> (25, one);

writeDLinkedList(header);
于 2013-04-23T21:57:43.200 に答える