2016-06-09 101 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方法,切換到無效工作完美。謝謝。 –