Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 正在努力将双链接的通用列表转换为循环列表。(SEGFULT)_C++_Templates_Linked List - Fatal编程技术网

C++ 正在努力将双链接的通用列表转换为循环列表。(SEGFULT)

C++ 正在努力将双链接的通用列表转换为循环列表。(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

所以我有一个非循环的双链表样本,我发现很难把它转换成循环的。(在//添加的线路上分段断层) 任何建议都很好。 提前谢谢。 另外,我应该使用重载来处理不同类型的输入吗?我如何操纵它们?一个合适的例子链接(真的找不到)会让我很高兴

main.cpp

#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;