Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.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++ 填写双向遍历的双链表_C++_Linked List - Fatal编程技术网

C++ 填写双向遍历的双链表

C++ 填写双向遍历的双链表,c++,linked-list,C++,Linked List,大家晚上好,我还有一个问题。像往常一样,如果这是一个重复,请指向我正在复制的线程(如果我能找到它,我就不会发布)。我正在我的github上浏览和更新一些古老的代码,并将其改写为不那么低能,最后我遇到了一个理论和实现的问题。在双链接列表中(需要跟踪head和tail),第一个成员应该如何初始化?从前面推动会留下未初始化(或未正确初始化)的尾部,反之亦然 这就是我的意思 template <typename T> void double_list<T>::push_back(

大家晚上好,我还有一个问题。像往常一样,如果这是一个重复,请指向我正在复制的线程(如果我能找到它,我就不会发布)。我正在我的github上浏览和更新一些古老的代码,并将其改写为不那么低能,最后我遇到了一个理论和实现的问题。在双链接列表中(需要跟踪head和tail),第一个成员应该如何初始化?从前面推动会留下未初始化(或未正确初始化)的尾部,反之亦然

这就是我的意思

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。为这个列表定义一个高效的迭代器接口会很有趣。