我正在尝试从右(后/尾)到左(头/前)从每个节点输出元素。但是,我的程序进入一个无限循环,一遍又一遍地显示相同的元素。尽管它有无限循环,我创建的DisplayFromLeftToRight()函数(在DisplayFromRightToLeft()函数下面找到)的功能就像一个魅力,但这并不...
void DisplayFromRightToLeft()
{
node *newnode = rear;
int num = 1;
while (newnode != NULL)
{
cout << "Node # " << num << ": " << newnode->data << endl;
newnode = newnode->previous;
num++;
}
return;
}
这是从每个节点打印元素的工作代码,从LEFT到RIGHT ..
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;
}
}
答案 0 :(得分:1)
看起来INSERT总是在有效地址之前设置,所以你的while(newnode!= NULL)循环永远不会结束,因为它每次都会设置newnode = newnode-&gt;。
你是正确的,问题似乎在你的INSERT函数和/或任何其他代码中确定列表中的内容。
你的显示......()函数看起来不错,只要不循环,但是通过使它们依赖于while(someNode!= NULL)循环,它们依赖于列表数据很好的假设-formed。具体来说,第一个节点必须有一个指向NULL的前一个指针,最后一个节点必须有一个指向NULL的下一个指针,否则其中一个Display函数将循环,直到找到NULL为止。
查看INSERT函数,如果按照这些步骤进行操作,您将看到它为newnode分配了一个新的有效地址,然后设置了该有效地址的前一个,而next接收了NULL,并且它可以分配给其他东西。以前怎么会是NULL? Previous也指向插入的节点本身,看起来像之前的任何循环只是继续查看同一个节点。
每当使用我实现的链接列表时,我总是会逐步完成代码和图表 - 在纸面上是最好的,而不仅仅是想象力。只绘制实际拥有代码的内容。否则,您可能假设结果列表数据是您想要的,而不是您实际编码的内容。
答案 1 :(得分:0)
你应该改变:
newnode->previous = newnode;
要:
newnode->previous = rear;
行:
newnode->previous = newnode;
毫无意义。这就好说我是我自己的父亲。