这是我尝试过的。我收到运行时错误:| ....确切地说,我认为我的推送功能有问题,但我似乎无法弄明白!!
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;
}
}
};
答案 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;
为什么不做
之类的事情我没试过这个,但我认为这是安全的。
答案 2 :(得分:0)
这里有很多错误,但我看到的第一个错误与push()
中第一个元素的初始化有关:
if(!head) //initial situation
head=new node(val,head,head);
由于head为NULL
,新节点的next
和prev
指针也将为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