我得到了一些数据(直到我解决了这个问题,这些数据才真正存在……)我需要能够在我的程序中进行操作。然而,我不能想出一个合适的结构来存储它。
数据表示一组路径和节点。有一个输入(在某些情况下可能不存在),然后在以输出结尾的节点之间有多个路径(末端可能没有输出,但输出总是在末端)。每个输入、节点和输出都有一个位置,并且整个数据都可以以图形方式操作,所以无论我使用什么结构,都需要在运行时以潜在的不可预测的方式轻松地更改的内容(例如,将输入更改为输出,然后将另一个输出作为输入)。
我考虑使用树形结构,其中每个项目都有一个父项(根除外)和多个子项,例如:
Input
|
node---
|  |  |
|  |  Output
|  |
|  Node---Output
|  |---Output
|
Node----Node
|        |
Node     Output    然而,我可以看到一些这样的问题,比如如果没有输入,或者它的删除/更改/等等。
这是一个可视化的例子。>是输入O节点和[]输出。
http://unisonmodules.co.uk/wjnewbery/data.png
@Everyone建议使用我已经提到的树形结构
如果树实际上是合适的,我如何克服给定数据集甚至没有输入/根的问题,比如下面的问题。然后会发生什么呢?如果输入节点/点/任何东西发生变化(通过移除然后添加),我需要完全重建树吗?我该怎么做?
http://unisonmodules.co.uk/wjnewbery/data2.png
我将看一下图表。
发布于 2010-03-02 20:12:40
看起来你真的需要更多的自由结构而不是一棵树。每个节点可以有多个节点连接到它;每个连接有一个方向。任何节点都可以附加输入或输出。在创建和更新树时,不强制执行循环连接,并且只有一个输入由您决定。
这些结构可以是多重链表,如下所示:
            struct Node {
              NodeContentType type;  //Input, Output, None.
              InOutNode* content;    //pointer to input or output
              Link* links;           //pointer to first connection (if any), NULL if none.
            }
            struct Link {
              Node* node;  //node this connection links to.
              Link* next;  //pointer to next connection
            }示例树:
 INPUT
 |
 root
 |
 branch1---leaf2---output2
 |
 leaf1
 |
 output1可能是这样的:(顺序显然是错误的…)
            Node root    = { Input, &input_function, &link1 };
            Link link1   = { &branch1, NULL };
            Node branch1 = { None,  NULL, &link2 };
            Link link2   = { &leaf1, &link3 };
            Link link3   = { &leaf2, NULL };
            Node leaf1   = { Output, &output_function1, NULL };
            Node leaf2   = { Output, &output_function2, NULL };发布于 2010-03-02 19:29:32
您可以像这样创建一个类:
enum NodeType
{ Node, Output };
class TreeElement
{
  NodeType myType;
  union
  {
    Node myNode;
    Output myOutput;
  } NodeVariant;
};Node和Output类取自您的清单。不同之处在于Node类可以包含一系列TreeElement实例。此列表表示元素的子元素。
发布于 2010-03-02 19:42:08
Composite pattern在这里可能非常有用。您可以将节点实现为一种容器,它再次保存输出或节点对象。在该链接中,您将看到更多代码片段作为实现提示。
https://stackoverflow.com/questions/2362694
复制相似问题