使用Graphviz作为库删除节点

时间:2015-03-05 13:07:40

标签: c++ graphviz

我使用graphviz作为C ++中的库。我用它来布局我的图表,例如计算节点和边的位置,但自己进行渲染。

我的问题涉及删除节点及其对相邻边缘的影响。遗憾的是,graphviz主页上提供的所有文档都没有解决这个问题。在这篇文章(Questions about Graphviz API (Graphviz as a library))中暗示了这一点,但也没有回答。我希望在这里找到答案。

我有: Agraph_t * myGraph和其中一个节点为Agnode_t * myNode。 当我使用agdelnode(myGraph,myNode)时,myNode附近的边缘会发生什么?它们是从头/尾删除还是脱离了?

agdelnode(也是agdeledge和agclose)的返回类型是什么意思?我的猜测是它表示函数的成功(0 =成功)和(每隔一个值=发生错误)。

2 个答案:

答案 0 :(得分:1)

  

当我使用agdelnode(myGraph,myNode)时,myNode附近的边缘会发生什么?它们是从头/尾删除还是脱离了?

将删除与myNode相邻的所有边缘并释放其内存。

  

agdelnode(也是agdeledge和agclose)的返回类型是什么意思?我的猜测是它表示函数的成功(0 =成功)和(每隔一个值=发生错误)。

如果成功释放节点的内存,则返回的值为SUCCESS,否则返回FAILURE。

这是我对source code的解释(链接取自Tim Biegeleisen的回答)。

答案 1 :(得分:-2)

以下是我从this网站获取的agdelnode()的源代码。你可以通读它并回答你的问题。

int agdelnode(Agraph_t * g, Agnode_t * n) {
  Agedge_t *e, *f;

  if (!agfindnode_by_id(g, AGID(n)))
    return FAILURE; /* bad arg */

    if (g == agroot(g)) {
      for (e = agfstedge(g, n); e; e = f) {
        f = agnxtedge(g, e, n);
        agdeledge(g, e);
      }

      if (g->desc.has_attrs)
        agnodeattr_delete(n);

      agmethod_delete(g, n);
      agrecclose((Agobj_t *) n);
      agfreeid(g, AGNODE, AGID(n));
    }

    if (agapply (g, (Agobj_t *) n, (agobjfn_t) agdelnodeimage, NILnode, FALSE) == SUCCESS) {
      if (g == agroot(g))
        agfree(g, n); 

      return SUCCESS;

   } else
       return FAILURE;
}