我正在研究的C ++程序旨在通过利用无限数量的节点结构指针创建一个C ++自定义双链接列表类,其中包含数据值和内部两个指针。这是该计划的前提。不能使用STL LinkedList类,必须自己制作。
这就是说,如何创建一个没有特定指针数量的类成员变量?我不想在声明类时初始化50个节点,但是只使用其中的10个节点。同时,我不想只初始化5,然后不得不使用超过5.有一种方法可以在C ++中动态地将节点指针添加到链表类中,当节点指针被认为是成员变量?
我是否以正确的方式解决这个问题?如果是这样,我将如何做到这一点?
答案 0 :(得分:6)
想象一下:
+----------+-------+------+
| Previous | Data | Next |
| Node | Field | Node |
+----------+-------+------+
具有两个链接字段和数据字段的节点 (链接列表在绘制时总是更容易理解。)
我们可以有两个:
+----------+-------+------+
| Previous | Data | Next |
| Node | Field | Node |
+----------+-------+------+
^ |
| V
+----------+-------+------+
| Previous | Data | Next |
| Node | Field | Node |
+----------+-------+------+
第二个节点的Previous Node
字段指向第一个节点。第一个节点没有前辈,因此它的Previous Node
字段为空。
类似地,第一个节点的Next Node
字段指向第二个节点。第二个节点没有后继者,因此第二个节点的Next Node
字段为空。
这就是我认为需求的要求:使用指针的双向链表。
编辑1:三个节点
+----------+-------+------+
| Previous | Data | Next |
| Node | Field | Node |
+----------+-------+------+
^ |
| V
+----------+-------+------+
| Previous | Data | Next |
| Node | Field | Node |
+----------+-------+------+
^ |
| V
+----------+-------+------+
| Previous | Data | Next |
| Node | Field | Node |
+----------+-------+------+
如您所见,要以转发方式访问(遍历)节点,请按照一个节点的链接字段转到下一个节点。同样,要以向后方式进行操作,请按照Previous Node
链接访问节点的前任。
关于链接的一个很好的问题是,您只需要更改链接字段,以便在列表的 middle 中插入节点。插入过程的绘制留给读者练习。
编辑2:容器类
链接列表是节点的容器。对于简单实现,Container类不应该是Node。
Container 有一个指向第一个节点的指针,也可以指向最后一个节点的指针:
+------+-------+
| Last | First |
| Node | Node |
+------+-------+
| |
| +---------------+
| |
| V
| +----------+-------+------+
| | Previous | Data | Next |
| | Node | Field | Node |
| +----------+-------+------+
| ^ |
| | V
| +----------+-------+------+
| | Previous | Data | Next |
| | Node | Field | Node |
| +----------+-------+------+
| ^ |
| | V
| +----------+-------+------+
| | Previous | Data | Next |
+->| Node | Field | Node |
+----------+-------+------+
通过使用容器类,您不必担心使用空节点作为第一个节点。在这里,我们使用一个简单的指针指向第一个节点。此外,还有一个指向最后一个节点的指针。
指向最后一个节点的指针可加快将节点附加到列表的操作。如果没有此指针,则必须遍历所有节点才能找到最后一个节点,这需要花费大量时间。