这里我将下一个节点设为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...
}
答案 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
例程更改为不使用下一个例程,而是使用当前节点。