0

このメソッドでリンクされたリストを作成しました...

class stack
{
    struct node
    {
        int data;
        node *link;
    }*top;

void insert()
{ ... }

void display()
{ ... }

};

それは正常に動作します...今、自己完結型のリンクリストで同じ操作を実行しようとしていますが、エラーが発生します。これは私のコードです

class Element
{
public:
    Element(const std::string& str)
    {
        head = NULL;
        head -> data = str;
    }
    void Append(const Element& elem)
    {
        node *newnode;
        newnode=new node;
        newnode->data = elem;
        node *target=head;

        while(target->next != NULL)
            target = target->next;

        target -> next = newnode;
    }

private:
    struct node
    {
        string data;
        node *next;
    }*head;
};

void main()
{   
    Element *root = new Element("Hello");

    root->Append(Element("World"));
}

Element クラスだけを変更したいのですが、よくわかりません。

私はデータ構造に慣れておらず、オンライン参照に混乱しているため、プログラムで愚かな間違いを犯した可能性があります。

4

2 に答える 2

2

コンストラクターで -

head = NULL;
head -> data = str;

コードに未定義の動作があります。NULL ポインターでメンバーにアクセスしないでください。head適切なメモリ位置を指した後、次のことも行う必要があります-

head -> next = NULL;

追加操作が確実に機能するようにコンストラクターで。あなたがやろうとしていることを考えるとElement::Append、パラメーターを受け取るべきだと思います-std::string

newnode->data = elem;
于 2013-09-01T18:22:40.887 に答える
0

あなたのデザインは間違っていると思います。あなたの先生が何を言おうとしているのか、私は二番目に推測しているかもしれませんが、自己完結型のリストは次のようになるべきだと思います。

class Element
{
public:
    Element(const std::string& str)
    {
        data = str;
        next = NULL;
    }
    void Append(const Element& elem)
    {
        Element* tail = this;
        while (tail->next)
            tail = tail->next;
        tail->next = new Element(elem.data);
    }

private:
    string data;
    Element *next;
};

つまりElementノードクラスです。これは、先生が「自己完結型リンクリストクラス」と「要素はマネージャークラスではない」という意味だと思います。

与えられたmainコードでは、リストの開始が変数にどのようにあるかに注意してくださいroot。しかし、リストの先頭も保持しようとしてElement::headいます。したがって、あなたのデザインでは、リストの開始が 2 つの場所で保持されていますが、これはあまり意味がありません。これはあなたの先生が意図したものではないと思いますが、間違っている可能性があります。

于 2013-09-01T20:28:02.483 に答える