2016-06-09 9 views
0

Also muss ich eine .dot-Datei schreiben, um ein graphviz-Bild von einem sortierten avl-Baum zu machen. Method Header wurde zur Verfügung gestellt und ich muss damit auskommen.Stringstream zur Zeichenfolgenrückgabe?

Hauptfrage ist, wie ich die build_dot_content() -Methode richtig aufrufen, wenn es Teil von std :: string ist?

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

Bitte erweitern oder reword "Hauptfrage ist, wie ich die build_dot_content() -Methode richtig aufrufen, wenn es Teil von std :: string ist " Momentan kann ich nicht viel davon verstehen. – user4581301

+0

das ist der Fehler, den ich bekomme. avl.cpp: 216: undefined reference to 'avl :: build_dot_content (std :: basic_stringstream , std :: allocator > &, avl_node *, int)‘ collect2: Fehler: ld returned 1 exit status –

+0

Entschuldigung für die Nitpicking aber 'fptr'? Dateizeiger? Hä? 'fstream'! =' FILE * '. Es ist kein Zeiger, es ist ein Stream-Objekt. – emlai

Antwort

0

Sie müssen diese Funktion in zwei Teile aufteilen;

  1. Hauptfunktion, die mit dem Knoten und i
  2. Eine zweite Funktion, die den Knoten nur

Anruf mit dem Wurzelknoten bezeichnet wird, und in dieser Funktion ausströmt die zweite Funktion sich von der ersten rekursiv selbst aufrufen, um den Baum zu streamen. Am Ende der Hauptfunktion, erzeugen Sie die Zeichenfolge aus dem Stream und senden Sie es ..

- Alternativ

Sie Dump-Funktion bereits einen Strom hat, übergeben diese an die build_dot_content Funktion zusammen mit dem Knoten und Index , und dies kann die Elemente rekursiv streamen - es sollte nicht die Zeichenfolge zurückgeben ...

+0

Leider muss ich es mit den angegebenen Überschriften tun, TA benötigt die Funktionen verwendet werden, wie definiert –

+0

Sie können die Signaturen nicht ändern? dann gehe mit dem letzteren Ansatz, ignoriere einfach den Rückgabewert und gebe eine leere Zeichenkette zurück, ehrlich gesagt, es ist eine dumme Signatur .. Es sollte 'void build_dot_content (std :: ostream & o ...) 'sein, damit du dann das propagieren kannst Datei-Stream direkt ... – Nim

+0

Ja, ich bin mir nicht sicher, warum er es als Std: String-Methode hatte, funktionierte das Umschalten auf Void perfekt. Vielen Dank. –