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

I want to implement a doubly circular linked list - runtime error in my code

本文关键字:一个 循环链表 运行时错误 我的 代码 实现      更新时间:2023-10-16

这是我尝试过的。 我收到运行时错误:| ....准确地说,我认为我的推送功能有问题,但我似乎想不通!!

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

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

一个可能的解决方案是:

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

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

还有你为什么要做这样的事情

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

你为什么不做类似的事情

  • 抓住头说H
  • 获得负责人以前的发言权 HP
  • 创建新节点,例如 N 的上一个 = HP,N 的下一个 = H
  • 现在将 H 前面设置为 N
  • 和惠普在N旁边。

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

这里有很多错误,但我看到的第一个错误与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 指针,随后崩溃。

在这里给你一个骨头,并为你提供到目前为止已经实现的代码的工作重构,它可能会给你一种更好地理解你正在做的事情的方法。我还将采取下一步来添加"尾部"指针。

#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