我试图输出每个节点的元素,从右(后/尾)到左(头/前)。但是,我的程序进入了一个无限循环,一遍又一遍地显示相同的元素。尽管存在无限循环,但我创建的 DisplayFromLeftToRight() 函数(位于 DisplayFromRightToLeft() 函数下方)工作起来很神奇,但这并不...
void DisplayFromRightToLeft()
{
node *newnode = rear;
int num = 1;
while (newnode != NULL)
{
cout << "Node # " << num << ": " << newnode->data << endl;
newnode = newnode->previous;
num++;
}
return;
}
这是从左到右从每个节点打印元素的工作代码。
void DisplayFromLeftToRight()
{
node *newnode = front;
int num = 1;
while (newnode != NULL)
{
cout << "Node # " << num << ": " << newnode->data << endl;
newnode = newnode->next;
num++;
}
return;
}
如果您认为我的 DisplayFromRightToLeft() 函数是正确的,我认为问题出在 INSERT 函数上,请看一下:
void INSERT(int _data)
{
node *newnode = new node;
newnode->data = _data;
newnode->next = NULL;
newnode->previous = newnode;
rear = newnode;
node *index = new node;
index = front;
if (isEmpty())
front = newnode;
else
{
while (index->next != NULL)
{
index = index->next;
}
index->next = newnode;
}
}
最佳答案
看起来 INSERT 总是将 previous 设置为有效地址,因此您的 while (newnode != NULL) 循环将永远不会结束,因为它每次都会设置 newnode = newnode->previous。
您是正确的,问题似乎出在您的 INSERT 函数和/或任何其他确定列表中内容的代码中。
您的 Display...() 函数本身看起来没有循环,但通过使它们依赖 while(someNode != NULL) 循环,它们依赖于列表数据良好的假设-形成。具体来说,第一个节点必须有一个指向 NULL 的 previous 指针,最后一个节点必须有一个指向 NULL 的 next 指针,否则其中一个 Display 函数将循环直到找到 NULL。
查看INSERT函数,如果按照步骤操作,你会看到它为newnode分配了一个新的有效地址,然后将previous设置为该有效地址,而next为NULL,它可以将next分配给其他东西. previous 怎么会是 NULL? Previous 还指向插入的节点本身,这看起来就像任何在 previous 之后的循环都将继续查看同一个节点。
每当使用我实现的链接列表时,我总是逐步查看代码和图表,了解发生了什么 - 在纸上是最好的,而不仅仅是想象。只绘制您实际让代码执行的操作。否则,您可能会假设结果列表数据是您想要的,而不是您实际编码的。
关于c++ - 打印节点从REAR到FRONT进入死循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27366561/