嗨,我想制作一棵树,在父子之间保持双向引用。但似乎不可能实现,因为当我创建第一个对象时,我没有另一个对象,因此无法引用它。这是一些示例代码。
-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)
有没有办法实现这种结构。
当您有“链接”(如指针)时,您可以创建双向链表。在 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"]