使用.dot语言绘制双向循环链表,如何将一条循环边移至节点上方?
双向循环链表Dot绘图问题
尝试用Dot语言绘制双向循环链表,生成的图不符合预期:两条循环边均位于节点下方,希望其中一条显示在节点上方。
期望效果

实际效果

原Dot代码
digraph { node[shape=record]; graph[pencolor=transparent]; rankdir=LR; p1[label="{<prev>|<data> 12|<next>}"]; p2[label="{<prev>|<data> 12|<next>}"]; p3[label="{<prev>|<data> 12|<next>}"]; p1:next -> p2:prev; p2:next -> p3:prev; p2:prev -> p1:next; p3:prev -> p2:next; edge[tailclip=false,dir="forward" splines="compound" constraint= "false"]; p3:next -> p1:prev; p1:prev -> p3:data; }
解决方案
要让其中一条循环边绕到节点上方,可通过指定边的端口属性、调整布局约束来实现,修改后的代码如下:
digraph { node[shape=record]; graph[pencolor=transparent]; rankdir=LR; p1[label="{<prev>|<data> 12|<next>}"]; p2[label="{<prev>|<data> 12|<next>}"]; p3[label="{<prev>|<data> 12|<next>}"]; // 正向链表边 p1:next -> p2:prev; p2:next -> p3:prev; // 反向链表边(下方) p2:prev -> p1:next [dir=back]; p3:prev -> p2:next [dir=back]; // 首尾循环边:从节点顶部走 p3:next -> p1:prev [tailport=n, headport=n, splines=polyline, constraint=false]; // 首尾反向循环边:从节点底部走 p1:prev -> p3:next [dir=back, tailport=s, headport=s, splines=polyline, constraint=false]; }
修改说明
- 端口强制指定:用
tailport=n/headport=n(n代表顶部)让一条循环边从节点顶部穿过,tailport=s/headport=s(s代表底部)让另一条从底部走,直接控制边的走向。 - 箭头方向简化:用
dir=back设置反向边的箭头,替代重复绘制正向边的冗余写法。 - 布局约束调整:
constraint=false避免边干扰节点的横向排列,splines=polyline让边的折线更规整,贴合双向链表的常规视觉呈现。
内容的提问来源于stack exchange,提问作者Diego Huite
相关产品推荐
相关产品推荐

