我想实现一个双循环链表 - 我的代码中的运行时错误

时间:2013-11-16 19:45:22

标签: c++ data-structures

这是我尝试过的。我收到运行时错误:| ....确切地说,我认为我的推送功能有问题,但我似乎无法弄明白!!

    class dcll
    {
    struct node
    {
       T data;
      node *next; node* prev;
       node(){}
       node(T data,node* n,node *p)
     {
        this->data=data; next=n; prev=p;
     }
   };
    node *head;  
    public:
    dcll(){head=NULL;}
    void push( T val)
    {
          if(!head) //initial situation
      head=new node(val,head,head);
          else //successive insertions
   {
      node *new_node=head; 
     while(new_node->next!=head)
     new_node=new_node->next;
     new_node->next=new node(val,head,new_node);
     head->prev=new_node->next;
   } 
    }

    };

4 个答案:

答案 0 :(得分:2)

问题是,在头节点初始化期间,将指针作为参数传递给头节点。但是,此指针在该时间点仍为NULL,因为它只在创建对象后获取新对象的地址。

可能的解决方案是:

void push( T val)
{
    if(!head) //initial situation
        head=new node(val,head,head);
        head->next=head;
        head->prev=head;
    else //successive insertions
    {
      ...
    } 
}

答案 1 :(得分:0)

你能解释一下你得到的错误吗?

你为什么要做这样的事呢

while(new_node->next!=head)
    new_node=new_node->next;

为什么不做

之类的事情
  • 抓住头说H
  • 让人们先前说出惠普
  • 创建新节点说N,其中N的前一个= HP,N的下一个= H
  • 现在将H设置为N
  • 和惠普旁边的N。

我没试过这个,但我认为这是安全的。

答案 2 :(得分:0)

这里有很多错误,但我看到的第一个错误与push()中第一个元素的初始化有关:

if(!head) //initial situation
    head=new node(val,head,head);

由于head为NULL,新节点的nextprev指针也将为NULL

这会导致您在尝试呼叫push()时看到的运行时错误。具体来说,这个循环不起作用:

node *new_node=head; 
while(new_node->next!=head)
    new_node=new_node->next;

new_node最初是一个有效的指针,但是new_node->next是NULL,所以在第二次迭代时,你的代码会尝试取消引用NULL指针并随后崩溃。

答案 3 :(得分:0)

在这里给你一个骨头并为你提供你迄今为止实现的代码的工作重构,它可能会给你一个更好地包围你正在做的事情的方法。我还将采用下一步添加“尾部”指针。

#include <iostream>

template<typename T>
class DCLL
{
    // internal representation of a Node
    struct Node
    {
        T        m_value;
        Node*    m_next;
        Node*    m_prev;

        inline Node(T value, Node* prev, Node* next)
        {
            m_value = value;
            m_prev = prev;
            m_next = next;
            if (m_prev)
                m_prev->m_next = this;
            if (m_next)
                m_next->m_prev = this;
        }
    };

    Node* m_head;
    Node* m_tail;

public:
    DCLL() : m_head(nullptr), m_tail(nullptr) {}

    void push_front(T val)
    {
        m_head = new Node(val, nullptr, m_head);
        if (!m_tail)
            m_tail = m_head;
    }

    void push_back(T val)
    {
        m_tail = new Node(val, m_tail, nullptr);
        if (!m_head)
            m_head = m_tail;
    }

    void walk() const
    {
        for (Node* node = m_head; node != nullptr; node = node->m_next) {
            std::cout << node->m_value << ' ';
        }
        std::cout << '\n';
    }
};

int main()
{
    DCLL<int> ints;
    ints.push_front(3);
    ints.push_front(2);
    ints.push_front(1);
    ints.push_back(4);
    ints.push_back(5);
    ints.push_back(6);

    ints.walk();

    return 0;
}

您可以在此处查看演示:http://ideone.com/nwlrbi