绘制 hash 表的数据结构
视频锁定
{$ currentTime | date:'mm:ss' $}
{$ timeLeft | date:'mm:ss' $}
从代码上看,由于结构体存在引用关系,不够清晰,如果层次较多,则很难以记住各个结构之间的关系,我们可以通过下图来更清楚的展示:
脚本如下:
digraph st2{
fontname = "Verdana";
fontsize = 10;
rankdir=TB;
node [fontname = "Verdana", fontsize = 10, \
color="skyblue", shape="record"];
edge [fontname = "Verdana", fontsize = 10, \
color="crimson", style="solid"];
st_hash_type \
[label="{<head>st_hash_type|(*compare)|(*hash)}"];
st_table_entry \
[label="{<head>st_table_entry|hash|key|record|<next>next}"];
st_table \
[label="{st_table|<type>type|num_bins|num_entries|<bins>bins}"];
st_table:bins ->
st_table_entry:head;
st_table:type ->
st_hash_type:head;
st_table_entry:next ->
st_table_entry:head \
[style="dashed", color="forestgreen"];
}
应该注意到,在顶点的形状为”record”的时候,label 属性的语法比较奇怪,但是使用起来 非常灵活。比如,用竖线”|”隔开的串会在绘制出来的节点中展现为一条分隔符。用”<>” 括起来的串称为锚点,当一个节点具有多个锚点的时候,这个特性会非常有用,比如节点 st_table的type属性指向st_hash_type,第4个属性指向st_table_entry等,都是通过锚点来实现的。
我们发现,使用默认的 dot 布局后,绿色的这条边覆盖了数据结构 st_table_entry,并不美观,因此可以使用别的布局方式来重新布局,如使用 circo 算法:
则可以得到更加合理的布局结果。
在线练习
{$ activeFileHint $}