class个成员变量的不定数量(C++)

Indefinite quantity of a class member variable(C++)

我正在处理的 C++ 程序旨在通过使用不定数量的节点结构指针在 C++ 中创建一个自定义双向链表 class,其中包含一个数据值和两个指针。这是这个程序的前提。不能使用 STL LinkedList class,必须自己制作。

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

我的做法是否正确?如果是这样,我将如何着手做这件事?

想象一下:

+----------+-------+------+  
| Previous | Data  | Next |  
| Node     | Field | Node |  
+----------+-------+------+  

具有两个 link 字段和一个数据字段的节点。
(链表越画越容易理解。)

我们可以有两个:

+----------+-------+------+  
| Previous | Data  | Next |  
| Node     | Field | Node |  
+----------+-------+------+  
    ^                  |  
    |                  V  
+----------+-------+------+  
| Previous | Data  | Next |  
| Node     | Field | Node |  
+----------+-------+------+  

第二个节点的Previous Node字段指向第一个。第一个节点没有 predecessors,所以它的 Previous Node 字段是空的。

同理,第一个节点的Next Node字段指向第二个节点。第2个节点没有后继,所以第2个节点的Next Node字段为空。

这就是我认为需求想要的:使用指针的双重 linked 列表。

编辑 1:三个节点

+----------+-------+------+  
| Previous | Data  | Next |  
| Node     | Field | Node |  
+----------+-------+------+  
    ^                  |  
    |                  V  
+----------+-------+------+  
| Previous | Data  | Next |  
| Node     | Field | Node |  
+----------+-------+------+  
    ^                  |  
    |                  V  
+----------+-------+------+  
| Previous | Data  | Next |  
| Node     | Field | Node |  
+----------+-------+------+  

如您所见,要以前向方式访问(遍历)节点,您可以按照一个节点的link字段到达下一个节点.同样,要以 向后 方式进行,您可以按照 Previous Node link 到达节点的前任。

关于 link 的一个很好的问题是,您只需更改 link 字段即可在 中间 插入一个节点名单。插入过程的绘图留作 reader 的练习。

编辑 2:容器 Class
链表是 容器 节点 。对于简单的实现,Container class 不应该是一个 Node。

容器有一个指向第一个节点的指针和一个可选的指向最后一个节点的指针:

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

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

指向最后一个节点的指针加快了将节点追加到列表的操作。如果没有这个指针,你将不得不遍历所有节点才能找到最后一个节点,这会花费很多时间。