C++ 正在努力将双链接的通用列表转换为循环列表。(SEGFULT)
所以我有一个非循环的双链表样本,我发现很难把它转换成循环的。(在//添加的线路上分段断层) 任何建议都很好。 提前谢谢。 另外,我应该使用重载来处理不同类型的输入吗?我如何操纵它们?一个合适的例子链接(真的找不到)会让我很高兴 main.cppC++ 正在努力将双链接的通用列表转换为循环列表。(SEGFULT),c++,templates,linked-list,C++,Templates,Linked List,所以我有一个非循环的双链表样本,我发现很难把它转换成循环的。(在//添加的线路上分段断层) 任何建议都很好。 提前谢谢。 另外,我应该使用重载来处理不同类型的输入吗?我如何操纵它们?一个合适的例子链接(真的找不到)会让我很高兴 main.cpp #include <iostream> #include "dlring.cpp" int main() { dlring<int> dlist; dlist.Append( 11 ); dlist.Pus
#include <iostream>
#include "dlring.cpp"
int main()
{
dlring<int> dlist;
dlist.Append( 11 );
dlist.Push( 100 );
while(dlist)
std::cout << dlist.pop_back() << " ";
}
#包括
#包括“dlring.cpp”
int main()
{
数据列表;
数据列表追加(11);
数据列表推送(100);
while(数据列表)
标准:库特头
如果(尾部->上一个)
{
尾部->上一个->下一个=尾部;
head->prev=tail;//已添加
}
if(空())
头=尾;
}
模板
void dlring::推送(T数据)
{
head=新节点(数据、尾部、头部);//更改为NULL=>tail
如果(头->下一步)
{
头部->下一步->上一步=头部;
尾部->下一步=头部;//已添加
}
if(空())
尾=头;
}
模板
T dlring::pop_back()
{
if(空())
库特普雷夫;
如果(尾部)
{
tail->next=head;//null=>head;
head->prev=tail;//已添加
}
其他的
head=nullptr;//NULL=>nullptr
删除临时文件;
返回数据;
}
模板
T dlring::pop_front()
{
if(空())
std::coutnext;
若有(总目)
{
head->prev=tail;//NULL=>nullptr=>tail
尾部->下一个=头部;
}
其他的
tail=nullptr;//NULL=>nullptr
删除临时文件;
返回数据;
}
您的问题出现在弹出式返回功能中:
node * temp(tail);
T data(tail->data);
tail = tail->prev;
if(tail)
{
tail->next = head; //null=>head;
head->prev = tail; //added
}
else
{
head = nullptr; //NULL=>nullptr
}
delete temp;
当列表中只有一个节点时,tail
不是null
-这意味着将满足if
条件,并将命中以下代码:
tail->next = head; //null=>head;
head->prev = tail; //added
但是这个代码什么都不做,因为tail
和head
是一回事。然后删除列表中唯一的节点,head
和tail
不再指向任何对象。要解决此问题,您需要一种更好的方法来检测删除后列表是否为空,并稍微更改删除代码:
if (tail != temp)
{
tail->next = head; //null=>head;
head->prev = tail; //added
}
else
{
head = nullptr; //NULL=>nullptr
tail = nullptr;
}
delete temp;
temp = nullptr;
聪明,但简单!非常感谢,很遗憾我不能投票支持。我是否应该通过更好的方式实现检查(如nullptr检查)来摆脱bool empty()?UPD:继续这项工作,并通过编辑帖子在这里留下一个有用的工具。不要编辑问题,而是接受这篇帖子作为答案。@ГПППццМааС照用户4581301说的做。如果这解决了您的问题,您应该接受答案并提出新问题,而不是编辑当前问题。而且,我真的没有更好的方法来检查空的,真的。您可以跟踪大小或添加一个始终是尾部和头部的虚拟节点,但这可能需要一些工作。@dwcanillas完成后,应考虑虚拟节点的实现。顺致敬意,
tail->next = head; //null=>head;
head->prev = tail; //added
if (tail != temp)
{
tail->next = head; //null=>head;
head->prev = tail; //added
}
else
{
head = nullptr; //NULL=>nullptr
tail = nullptr;
}
delete temp;
temp = nullptr;