使用 rank=same 时丢失 x y 边

Lost x y edge when using rank=same

我正在尝试使用 GraphViz 可视化双向链表。 一个例子:

digraph List {
    rankdir=LR;
    node [shape=record];
    0 [label="{<prev> | <length> 2 | <tone> 1 | <next>}"];
    1 [label="{<prev> | <length> 1 | <tone> A | <next>}"];
    0:<next>:c -> 1:n [arrowhead=vee, arrowtail=dot, dir=both, tailclip=false, arrowsize=1.2];
    1:<prev>:c -> 0:s [arrowhead=vee, arrowtail=dot, dir=both, tailclip=false, arrowsize=1.2];
}

除了一件事,结果还不错;元素的高度。随着每个连续元素的添加,高度会降低,我希望所有元素都处于相同的高度。但是当我添加

{rank=same; 0; 1;}

发生 GraphViz 错误 (Error: lost 1 0 edge)。现在,我能找到的解决这个错误的唯一方法是用纯文本节点替换记录形状的节点,并使用 HTML 标签来创建记录形状。 我试过了,但它产生了同样的错误。

使用HTML标签的代码:

digraph List {
    rankdir=LR;
    node [shape=plaintext];
    0 [label=<
    <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
        <TR>
            <TD PORT="prev">     </TD>
            <TD PORT="length">2</TD>
            <TD PORT="note">1</TD>
            <TD PORT="next">     </TD>
        </TR>
    </TABLE>>];
    1 [label=<
    <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
        <TR>
            <TD PORT="prev">     </TD>
            <TD PORT="length">1</TD>
            <TD PORT="note">A</TD>
            <TD PORT="next">     </TD>
        </TR>
    </TABLE>>];
    0:next:c -> 1:n [arrowhead=vee, arrowtail=dot, dir=both, tailclip=false, arrowsize=0.8];
    1:prev:c -> 0:s [arrowhead=vee, arrowtail=dot, dir=both, tailclip=false, arrowsize=0.8];
}

如果有任何关于如何解决此问题的建议,我将不胜感激。

之前的尝试是这样的:

digraph List { 
    rankdir=LR;
    node [shape=record];
    0 [label="{<prev> | <firstName> Wolfgang Amadeus | <lastName> Mozart | <instrument> Klavier | <next>}"];
    1 [label="{<prev> | <length> 1 | <tone> A | <next>}"];
    0:<next>:c -> 1:<prev> [arrowhead=vee, arrowtail=dot, dir=both, tailclip=false, arrowsize=0.8];
    1:<prev>:c -> 0 [arrowhead=vee, arrowtail=dot, dir=both, tailclip=false, arrowsize=0.8];
}

这里两个箭头没有明显的区别。在节点之间获得两个不同的箭头也可以解决我的问题。

您可以在第一个节点的最后一个元素和第二个节点的第一个元素之间使用强(“重”)link 一条不可见的边缘来对齐节点。

将此行作为最后一行添加到您的 HTML 类代码中(与记录形状相比,这为您提供了更大的灵活性)

0:next:e -> 1:prev:w[ weight = 100, style = invis ];

你得到

这就是我想你想要的。