我在main函数中使用了这个,但是它不起作用
void LinkedList::TraPrinHead(const LinkedList& p)
{
Nodes* currentNodes = header->next;
while( currentNodes != tail ) {
cout << currentNodes->elem << " ----> ";
currentNodes = currentNodes->next; }
}
我希望从这打印整个列表…但是我总是得到无限循环
cout << currentNodes->elem << " ----> ";
currentNodes = currentNodes->next;
cout << currentNodes->elem << " ----> ";
currentNodes = currentNodes->next;
即使我把它简化为输出列表的前两个元素我没有得到无限循环但是对于不同的两个节点
得到相同的结果例如,我的第一个节点是A1,第二个是A2,但是有那个函数我期望得到A1 ----> A2但我得到的是A1 ----> A1 ---->
我想我的add功能有问题。
这是我使用的函数
void LinkedList::InsertDoublyBefore(Nodes* d, const string& e) {
if (header->next == tail)
{
Nodes* n = new Nodes;
n->elem = e;
n->next = tail;
n->prev = tail->prev;
tail->prev->next = tail->prev = n;
header->next = n; // very important!!!!
}
else
{
if (d==tail)
{
Nodes* n = new Nodes;
n->elem = e;
n->next = tail;
n->prev = tail->prev;
tail->prev = n;
}
else
{
Nodes* n = new Nodes;
n->elem = e;
n->next = d;
n->prev = d->prev;
d->prev->next = d->prev = n;
}
}
}
void LinkedList::InsertDoublyAfter(Nodes* d, const string& e)
{
InsertDoublyBefore(d->next, e);
}
void LinkedList::addtoFront(const string& e) { InsertDoublyBefore(header->next, e); }
void LinkedList::addtoBack(const string& e) { InsertDoublyBefore(tail, e); }
你的案例有点多余。应该由这个特定的插入函数处理的情况包括。
- d==head(需要将head更改为newNode)
- head==tail(需要改变head和tail,这也是当list为空时head==tail==NULL的情况)
你也可以考虑在办公时间拜访你的助教或导师。
你有很多关于基础概念的问题,如果你没有从课堂笔记中收集到足够的信息来理解这些想法背后的逻辑(从你所有的帖子中),那么你应该试着向你的导师、助教或校园里的其他选择寻求帮助。因为这些都是非常重要的思想,对于未来定制数据结构的开发和应用程序的开发都需要充分理解。
这一行
tail->prev->next = tail->prev = n;
看起来不对。在tail->prev = n
之后你要用tail->prev->next = ...
来修饰n->next
,而不是用tail->prev->next
。实际上,这里有未定义的行为,因为在表达式中修改并使用了相同的变量(tail->prev
),这要糟糕得多。
if (d==tail)
{
Nodes* n = new Nodes;
n->elem = e;
n->next = tail;
n->prev = tail->prev;
tail->prev = n;
}
你似乎只修改了一半的链接。
和
{
Nodes* n = new Nodes;
n->elem = e;
n->next = d;
n->prev = d->prev;
d->prev->next = d->prev = n;
}
你有类似上述的问题。
使用调试器。但在那之前,把一切都写在纸上。