C++ 填写双向遍历的双链表
大家晚上好,我还有一个问题。像往常一样,如果这是一个重复,请指向我正在复制的线程(如果我能找到它,我就不会发布)。我正在我的github上浏览和更新一些古老的代码,并将其改写为不那么低能,最后我遇到了一个理论和实现的问题。在双链接列表中(需要跟踪head和tail),第一个成员应该如何初始化?从前面推动会留下未初始化(或未正确初始化)的尾部,反之亦然 这就是我的意思C++ 填写双向遍历的双链表,c++,linked-list,C++,Linked List,大家晚上好,我还有一个问题。像往常一样,如果这是一个重复,请指向我正在复制的线程(如果我能找到它,我就不会发布)。我正在我的github上浏览和更新一些古老的代码,并将其改写为不那么低能,最后我遇到了一个理论和实现的问题。在双链接列表中(需要跟踪head和tail),第一个成员应该如何初始化?从前面推动会留下未初始化(或未正确初始化)的尾部,反之亦然 这就是我的意思 template <typename T> void double_list<T>::push_back(
template <typename T>
void double_list<T>::push_back(T data)
{
if(tail)
{
node<T>* temp = new node<T>;
temp->data = data;
this->tail->next = temp;
temp->prev = this->tail;
this->tail = temp;
}
else
{
if(!head) //New list
{
this->head = new node<T>;
this->tail = new node<T>;
this->tail->data = data;
this->tail->prev = this->head;
this->head->next = this->tail;
}
}
}
template <typename T>
void double_list<T>::pop_back(T* out)
{
if(this->tail->prev)
{
*out = this->tail->data;
this->tail = this->tail->prev;
this->tail->next = NULL;
//numel -= 1;
}
else
throw pop_empty();
}
模板
无效双_列表::推回(T数据)
{
如果(尾部)
{
node*temp=新节点;
温度->数据=数据;
此->尾部->下一步=温度;
temp->prev=此->尾部;
这个->尾部=温度;
}
其他的
{
if(!head)//新列表
{
此->头部=新节点;
此->尾=新节点;
此->尾部->数据=数据;
本->尾部->上一个=本->头部;
这个->头部->下一个=这个->尾部;
}
}
}
模板
void double_list::pop_back(T*out)
{
如果(此->尾部->上一个)
{
*out=本->尾->数据;
this->tail=this->tail->prev;
this->tail->next=NULL;
//numel-=1;
}
其他的
抛出pop_空();
}
main.cpp:
#include <iostream>
#include "list.h"
#include "list_inst.h"
using namespace std;
int main()
{
double_list<int> myList1;
double_list<int> myList2;
double_list<int> myList3;
double_list<int> myList4;
bool finished = false;
for(int i = 1; i <= 25; i++)
{
myList1.push_front(i);
myList2.push_front(i);
myList3.push_back(i);
myList4.push_back(i);
}
cout << "First list (25 - 1) forward traversal:\n";
while(!finished)
{
try
{
int val = 0;
myList1.pop_front(&val);
cout << val << ", ";
}
catch(pop_empty &bad_pop)
{
finished = true;
}
}
cout << "\n\n";
finished = false;
cout << "Second list (25 - 1) reverse traversal:\n";
while(!finished)
{
try
{
int val = 0;
myList2.pop_back(&val);
cout << val << ", ";
}
catch(pop_empty &bad_pop)
{
finished = true;
}
}
cout << "\n\n";
finished = false;
cout << "Third list (1 - 25) forward traversal:\n";
while(!finished)
{
try
{
int val = 0;
myList3.pop_front(&val);
cout << val << ", ";
}
catch(pop_empty &bad_pop)
{
finished = true;
}
}
cout << "\n\n";
finished = false;
cout << "Fourth list(1 - 25) reverse traversal:\n";
while(!finished)
{
try
{
int val = 0;
myList4.pop_back(&val);
cout << val << ", ";
}
catch(pop_empty &bad_pop)
{
finished = true;
}
}
cout << "\n\n";
finished = false;
return 0;
}
#包括
#包括“list.h”
#包括“列表安装h”
使用名称空间std;
int main()
{
双表myList1;
双表myList2;
双表myList3;
双表myList4;
bool finished=false;
对于(inti=1;i,head和tail不需要额外的节点。如果列表包含一个元素head,那么tail指向同一个元素
template <typename T>
void double_list<T>::push_back(T data)
{
if ( tail != nullptr )
{
node<T>* temp = new node<T>;
temp->data = data;
this->tail->next = temp;
temp->prev = this->tail;
this->tail = temp;
}
else
{
this->tail = this->head = new node<T>;
this->tail->prev = this->head->next = nullptr;
this->tail->data = data;
}
}
template <typename T>
void double_list<T>::pop_back(T* out)
{
if ( this->tail != nullptr )
{
node<T>* temp = this->tail;
*out = this->tail->data;
if ( this->tail->prev != nullptr )
{
this->tail = this->tail->prev;
this->tail->next = NULL;
}
else
this->tail = this->head = nullptr;
delete temp;
}
else
throw pop_empty();
}
模板
无效双_列表::推回(T数据)
{
if(tail!=nullptr)
{
node*temp=新节点;
温度->数据=数据;
此->尾部->下一步=温度;
temp->prev=此->尾部;
这个->尾部=温度;
}
其他的
{
此->尾部=此->头部=新节点;
本->尾->上一个=本->头->下一个=空PTR;
此->尾部->数据=数据;
}
}
模板
void double_list::pop_back(T*out)
{
如果(此->尾部!=nullptr)
{
节点*temp=this->tail;
*out=本->尾->数据;
如果(此->尾部->上一个!=nullptr)
{
this->tail=this->tail->prev;
this->tail->next=NULL;
}
其他的
此->尾=此->头=空PTR;
删除临时文件;
}
其他的
抛出pop_空();
}
<参考N.M.的评论,C++的解决方案是:<代码> STD::清单 .< /P>如果你的目标是改进这个代码,就废弃它,使用<代码> STD::清单< /COD>。如果你想了解双链表实现,请阅读你的代码> STD::清单< /Cord>实现。ata类型,这是为了我自己的利益,也是为了我帮助指导的朋友了解数据结构。至于阅读实现,我是在调试SDL gamepad input时这样做的。直接向我寻求帮助会更快。再说一次,我的意思是,我可以看出它的结果是多么糟糕,但我只是想解释一下。为教育实施双链接列表是非常好的,这没什么错。最终必须有人编写此std::实现。您将在这里得到的答案不会取代您自己的学习。他们会回答您的重点问题,但他们可能会也可能不会教给您最佳技术,如使用哨兵节点(据我所知,这是所有现有std实现中使用的一种技术)。谢谢你。我所要做的就是学习更多的理论,实践我所知道的,一个狭窄的答案就是我想要的,或者我所要求的。你忘了删除node.Hm。为这个列表定义一个高效的迭代器接口会很有趣。