自包含链表

时间:2013-09-04 08:37:10

标签: c++ linked-list

我的输出:

下一个节点是:

这里我将下一个节点设为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...
}

2 个答案:

答案 0 :(得分:3)

您的代码应打印“This”
因为你打电话

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

并且print被定义为打印Next()->data.c_str(),因为它不安全,因为Next()可能是NULL。

所以你的清单就像“你好” - > “世界” - > “这个”root是“你好”,root->Next是“世界”,当然它会在你的情况下打印“这个”

prabaly意味着使用Print()方法打印当前值,而不是下一个节点的值。所以把它改成

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

并使用标准流进行打印(std::cout),因为它是c ++

答案 1 :(得分:2)

你的设计有点奇怪。仅打印下一个节点是有效的选择,但这通常涉及创建虚拟根节点,因为节点"Hello"中的root永远不可访问。这也是造成这种奇怪行为的原因:

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

您可以将Print例程更改为不使用下一个例程,而是使用当前节点。