erlang中的双向链接数据结构

yil*_*yin 5 erlang tree

嗨,我想制作一棵树,在父子之间保持双向引用。但似乎不可能实现,因为当我创建第一个对象时,我没有另一个对象,因此无法引用它。这是一些示例代码。

-record(node,{name,children,root}).

main()->
    A = #node{name="node-A",
          children=[B], %variable B is  unbound
          root=nil},
    B = #node{name="node-B",
          children=[],
          root=A},
    Tree = A.
Run Code Online (Sandbox Code Playgroud)

这个问题的另一个例子是实现一个双向链表(http://en.wikipedia.org/wiki/Doubly_linked_list)

-record(node,{prev,name,next}).

main()->
    A = #node{prev=nil,
          name="node-A",
          next=B}, % variable B is unbound
    B = #node{prev=A,
          name="node-B",
          next=nil},
    LinkedList = A.
Run Code Online (Sandbox Code Playgroud)

有没有办法实现这种结构。

yet*_*ehe 3

当您有“链接”(如指针)时,您可以创建双向链表。在 erlang 中,你没有这样的链接,甚至没有真正的变量,你不能改变它们。以下是循环列表的一些示例,但应谨慎实施:Can Circular Lists be Define in Erlang?

也许您可以告诉我们为什么需要双向链接树?也许erlang有更好的解决方案。

编辑:您可以使用有向图。您的树可以表示为循环图,其中顶点从 A 到 B 以及从 B 到 A。具有根节点 A 以及子节点 B 和 C 的树的示例:

main()->
    Tree = digraph:new([cyclic]),
    A = digraph:add_vertex(Tree,"vertexA"),
    B = digraph:add_vertex(Tree,"vertexB"),
    C = digraph:add_vertex(Tree,"vertexC"),
    digraph:add_edge(Tree, A, B),
    digraph:add_edge(Tree, B, A),
    digraph:add_edge(Tree, A, C),
    digraph:add_edge(Tree, C, A),
    digraph:get_path(Tree, B, C).
Run Code Online (Sandbox Code Playgroud)

结果:["vertexB","vertexA","vertexC"]