1

私の出力:

次のノードは次のとおりです。

ここで、次のノードを次のように取得しますThis... 実際の次のノードは のはずですWorld。Next() の戻り値を次のように変更すると、

return nextnode;

次に、印刷します。

次のノードは: Hello

World次のノードとして印刷できません。

これを行うには助けが必要です...これが私のコードです、

class Element
{
public:
    Element(const std::string& str):   data(str), next(nullptr)
    {

    }

    void Append(const Element& elem)
    {
        Element *tail = this;
        //printf("%s\n", tail->data.c_str());
        while (tail->next)
            tail = tail->next;
        tail->next = new Element(elem.data);
    }

    void Print(int n)
    {       
        if(n==1)
        {           
            printf("The next node is: %s\n", Next()->data.c_str());         
        }
    }   

    Element *Next()
    {
        Element *nextnode = this;
        if(nextnode->next)
            return nextnode->next;

        return NULL;
    }

private:    
    string data;
    Element *next;  
};

void main()
{
    // construct a list
    Element *root = new Element("Hello");

    root->Append(Element("World"));
    root->Append(Element("This"));
    root->Append(Element("Is"));
    root->Append(Element("a"));
    root->Append(Element("Linked"));
    root->Append(Element("List"));      
    root->Next()->Print(1);//It prints 'World' if I change code here as root->Print(1);
                                // But I dont want to change here...
}
4

2 に答える 2

3

あなたのコードは「This」を出力することが期待されて
います

root->Next()->Print(1);

また、print は print に定義されていますがNext()->data.c_str()、Next() が NULL になる可能性があるため安全ではありません。

したがって、リストは「Hello」->「World」->「This」のようになりroot、「Hello」root->Nextは「World」になり、もちろん「This」と出力されます。

あなたがおそらく意味したのはPrint()、次のノードの値ではなく、現在の値を出力するメソッドを持つことです。だからそれを

printf("The next node is: %s\n", data.c_str());  

std::coutまた、C++ であるため、印刷 ( ) には標準ストリームを使用します。

于 2013-09-04T08:50:39.667 に答える
2

あなたのデザインはちょっと奇妙です。次のノードのみを出力することは有効な選択ですが、"Hello"in ノードrootにはアクセスできないため、通常はダミーのルート ノードを作成する必要があります。それが、この奇妙な動作の原因でもあります。

auto n = root->Next(); // Now we are at World
n->Print(1); // We print World->Next, so This

Print次のノードではなく現在のノードを使用するようにルーチンを変更できます。

于 2013-09-04T08:51:44.080 に答える