我想在我的代码中实现一个双重循环链表 - 运行时错误
I want to implement a doubly circular linked list - runtime error in my code
这是我尝试过的。 我收到运行时错误:| ....准确地说,我认为我的推送功能有问题,但我似乎想不通!!
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
,新节点的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 指针,随后崩溃。
在这里给你一个骨头,并为你提供到目前为止已经实现的代码的工作重构,它可能会给你一种更好地理解你正在做的事情的方法。我还将采取下一步来添加"尾部"指针。
#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
相关文章:
- 使用std::list创建循环链表
- 循环链表:无限循环
- 打印循环链表
- C++循环链表删除,计数从下一个节点开始
- C++ 循环链表的递归基本情况
- 循环链表的内存错误:未分配正在释放的指针
- 如何创建一个带有链表的程序,该链表会破坏第 n 个元素
- 返回指向循环链表某个点的指针
- 在 for 循环(链表)中删除两次后,变量不可用
- 无法通过一个单向链表数组创建邻接列表
- 尝试拆分循环链表.显示输出但崩溃.在 IDEone 中显示运行时错误
- 如何打印出双向循环链表
- 循环队列和循环链表
- 用C++创建一个双链表
- 我想在我的代码中实现一个双重循环链表 - 运行时错误
- 用C++打印出循环链表
- 制作一个带有链表的模板类
- 如何打印由另一个字符串链表组成的链表
- 我们可以用一个指针实现一个双链表吗
- 对一个双链表从低到高排序