无限数量的类成员变量(C ++)

时间:2015-02-11 01:22:30

标签: c++ class pointers linked-list nodes

我正在研究的C ++程序旨在通过利用无限数量的节点结构指针创建一个C ++自定义双链接列表类,其中包含数据值和内部两个指针。这是该计划的前提。不能使用STL LinkedList类,必须自己制作。

这就是说,如何创建一个没有特定指针数量的类成员变量?我不想在声明类时初始化50个节点,但是只使用其中的10个节点。同时,我不想只初始化5,然后不得不使用超过5.有一种方法可以在C ++中动态地将节点指针添加到链表类中,当节点指针被认为是成员变量?

我是否以正确的方式解决这个问题?如果是这样,我将如何做到这一点?

1 个答案:

答案 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 |  
     +----------+-------+------+  

通过使用容器类,您不必担心使用空节点作为第一个节点。在这里,我们使用一个简单的指针指向第一个节点。此外,还有一个指向最后一个节点的指针。

指向最后一个节点的指针可加快将节点附加到列表的操作。如果没有此指针,则必须遍历所有节点才能找到最后一个节点,这需要花费大量时间。