在构造函数中赋值双链表指针
Assigning doubly linked-list pointers in constructor
我正在尝试为双重链表创建几个节点并将它们打印出来。所以我创建了dnode类:
template <typename T>
class dnode
{
public:
T nodeValue;
dnode<T> *prev;
dnode<T> *next;
dnode() : prev(this), next(this) {}
dnode(const T& item, dnode<T> *prevNode = NULL, dnode<T> *nextNode = NULL) :
nodeValue(item), prev(prevNode), next(nextNode) {}
};
然后是writeList函数:
template <typename T>
void writeDLinkedList(dnode<T>* header, const string& seperator = " ")
{
dnode<T> *p = header->next;
while (p != header)
{
cout << p->nodeValue << seperator;
p = p->next;
}
cout << endl << endl;
}
在main中,我创建了一个头指针和两个节点,使用构造函数在循环列表中分配前一个和下一个节点:
dnode<int> *header, *one, *two;
header = new dnode<int>(0, two, one);
one = new dnode<int> (10, header, two);
two = new dnode<int> (25, one, header);
writeDLinkedList(header);
当我调用writeDLinkedList时,我得到一个分段错误。我对此感到困惑,所以我最终尝试单独输出每个节点值,以查看指针是否正常工作。事实证明并非如此。相反,我必须这样做才能使打印函数正常工作:
header = new dnode<int>;
one = new dnode<int> (10);
two = new dnode<int> (25);
header->next = one;
one->next = two;
two->next = header;
writeDLinkedList(header);
我想知道为什么构造函数没有按它应该的方式工作。是初始化列表吗?
构造函数正在工作。问题是你在变量被赋值之前就使用了它们。
dnode<int> *header, *one, *two;
// one and two have undefined values at this point
header = new dnode<int>(0, two, one);
// so undefined values get put into header->next and header->prev
在双链表中有指针循环,节点a指向节点B,节点B又指向节点a。根据定义,指针循环不能仅在构造函数中创建。因为节点A或节点B必须首先创建。不能先创建指向另一个节点的节点,因为该节点还不存在。
双链表比你想象的要复杂一些。
您没有正确管理节点。试试这个:
template <typename T>
class dnode
{
public:
T nodeValue;
dnode<T> *prev;
dnode<T> *next;
dnode() : prev(NULL), next(NULL) {}
dnode(const T& item, dnode<T> *prevNode = NULL) :
nodeValue(item), prev(prevNode), next(NULL)
{
if (prev)
{
if (prev->next)
prev->next->prev = this;
prev->next = this;
}
}
~dnode()
{
if (prev)
prev->next = next;
if (next)
next->prev = prev;
}
};
.
template <typename T>
void writeDLinkedList(dnode<T>* header, const string& seperator = " ")
{
dnode<T> *p = header;
while (p != NULL)
{
cout << p->nodeValue << seperator;
p = p->next;
}
cout << endl << endl;
}
.
dnode<int> *header, *one, *two;
header = new dnode<int>(0);
one = new dnode<int> (10, header);
two = new dnode<int> (25, one);
writeDLinkedList(header);
我想你是在尝试创建双循环列表。您可以首先创建单个节点,然后将它们连接起来。在双循环列表中连接两个节点后,必须将最后一个节点连接到第一个节点才能闭合循环。你可能会想尝尝。我已经为int做过了,但它可以很容易地放入模板中。
#include<iostream>
class dnode
{
public:
dnode(int a):prev(this), next(this), nodeValue(a)
{}
void connectNode(dnode *newNode)
{
if(newNode != NULL)
{
dnode*head = this->next;
this->next = newNode;
newNode->prev = this;
newNode->next = head;
head->prev = newNode;
}
}
void writeDNode()
{
dnode *p = this->next;
while(p != this)
{
std::cout<<"Element "<<p->nodeValue<<std::endl;
p = p->next;
}
}
private:
int nodeValue;
dnode *prev;
dnode *next;
};
int main(int argc, char*argv[])
{
dnode* header = new dnode(-1);
dnode *one = new dnode(23);
dnode *two = new dnode(45);
dnode *three = new dnode(67);
header->connectNode(one);
one->connectNode(two);
two->connectNode(three);
header->writeDNode();
std::getchar();
}
相关文章:
- C++,指针数组,指向双链表中的条目
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 链表指针问题
- 将链表转换为指针数组时出错
- 如何实现容纳整数和无效指针的双向链表?
- 创建一个棋盘格或"Interweave"两个链接列表。IE 更改两个链表的指针
- 为什么我在空指针错误(链表)中获取成员访问权限
- 链表删除功能的单指针 // 是可能的
- 如何深度复制链表对象指针
- 链表指针赋值为什么我们不能直接将尾巴分配给 temp 而不是尾巴>尾巴下一个
- C++链表指针始终为 nullptr
- 如何从链表指针字符中查找字符
- 多进程 c++(11),链表指针作为全局变量
- 指向结构崩溃的C++链表指针
- 链表-指针
- 链表指针错误没有意义
- 双链表指针的双链表向量
- 在构造函数中赋值双链表指针
- 链表指针
- 如何在头文件中实现的构造函数中将指向模板类的链表指针初始化为NULL