2016-06-09 90 views
0

所以我必须编写一个.dot文件来制作排序后的avl树的graphviz图像。方法头被提供了,我必须要做。Stringstream到字符串返回?

主要问题是如何正确调用build_dot_content()方法,当它是std :: string的一部分?

void avl::dump_dot(std::string filename){ 
    string s; 
    ofstream fptr; 
    fptr.open(filename); 
    fptr<<"digraph AVL {"<<endl<<"graph [dpi=150];"<<endl<<"nodsep=0.3;"<<endl; 
    fptr<<"ranksep=0.2;"<<endl<<"margin=0.1"<<endl<<"node [shape = circle fontname=\"Helvetica\"];"<<endl; 
    fptr<<"edge [arrowsize=0.8]"<<endl<<endl; 
    stringstream o; 

    s=string build_dot_content(o, root, 1); 
    fptr<<s<<endl<<"}"<<endl; 

} 

std::string build_dot_content(std::stringstream &o, avl_node *e, int i) { 
    o<<"node"<<i<<" [label =\""<<e->element<<"\"];"<<endl; 
    int iL = 2*i; 
    int iR = 2*i+1; 

    if(e->left != nullptr){ 
    o<<"node"<<i<<" -> node"<<iL<<";"<<endl; 
    build_dot_content(o, e->left, iL); 
    } 
    if(e->right != nullptr){ 
    o<<"node"<<i<<" -> node"<<iR<<";"<<endl; 
    build_dot_content(o, e->right, iR); 
    } 
    string s; 
    s = o.str(); 
    return s; 
} 
+1

请扩展或reword“如何正确调用build_dot_content()方法,当它是std :: string的一部分?”目前我无法理解它。 – user4581301

+0

这是我得到的错误。 avl.cpp:216:未定义引用到'avl :: build_dot_content(std :: basic_stringstream ,std :: allocator >&,avl_node *,int)' collect2:error:ld返回1退出状态 –

+0

对不起,但'fptr'?文件指针?咦? 'fstream'!='FILE *'。它不是一个指针,它是一个流对象。 – emlai

回答

0

你需要把这个功能分成两个;

  1. 主要功能被称为与流出的节点中仅

呼叫从所述第一与根节点的第二功能的节点和i

  • 第二个功能,在这种功能递归调用自己来流出树。在主函数结束时,产生从流串并返回它..

    - 或者

    您转储功能已经有一个流,它传递给build_dot_content功能与节点和指数一起,这可以递归流出的元素 - 它不应该返回字符串...

  • +0

    很遗憾,我必须使用给定的标题来做,TA要求按照定义使用函数 –

    +0

    您不能更改签名?然后去用后一种方法,只是忽略返回值并返回一个空白字符串,坦率地说这是一个愚蠢的签名..它应该是'void build_dot_content(std :: ostream&o ...)'这将允许您然后传播文件流直接... – Nim

    +0

    是的,我不知道他为什么把它作为一个std:string方法,切换到无效工作完美。谢谢。 –