Hallo, ich möchte einen Strukturbaum sortieren. D.h. die einzelen Unterstrukturen nach bestimmten kritrien ordnen. Das funktioniert einwandfrei mit einer Quicksortfunktion. Nun mein Problem: Ich gebe den originalen Strukturbaum in meine Sortierfunktion und bekomme einen neuen sortierten Strukturbaum zurück - dieser neue Baum bestitz jedoch Speicherabhänigkeiten zu dem originalen baum (das ganze kann man sich vorstellen wie eine verkettete Struktur - mit Pointern zum nächsten Element). Wenn ich also jetzt den Speicher des originalen Baums freigebe hat das auch Auswirkungen auf den Sortierten (kopierten) Baum -> das ist schlecht. Ich dachte ich könnte mit memcpy() sozusagen eine Kopie des orignalen Baums erstellen und diese Kopie dann ohne Auswirkungen auf das original verändern (und umgekehrt). Das geht leider nicht - oder ich mache es falsch! So sieht die Struktur aus: typedef struct xmlnodestruct { struct xmlnodestruct *parentnode; struct xmlnodestruct **childnodes; // Array of xmlnodes } XMLNODE; typedef XMLNODE *XMLNODEPTR; Danke schonmal...
max .. schrieb: > Ich dachte ich könnte mit memcpy() sozusagen eine Kopie des orignalen > Baums erstellen und diese Kopie dann ohne Auswirkungen auf das original > verändern (und umgekehrt). Das geht leider nicht - oder ich mache es > falsch! Du mußt in der Kopie natürlich auch die Zeiger anpassen. Die zeigen ja schließlich immer noch auf die Originale.
ja - das habe ich eben auch herausgefunden - das einzige problem sind die Abhängigkeiten der einzelen Element - ich darf nur die Inhalte kopieren und muss mir einen "leeren" neuen Baum erstellen mit eigenen Abhängigkeiten. Ich setze das gerade um - wenns klappt gibts die Lösung!
also es funktioniert. man muss sich eben einen "leeren" Baum erstellen und dann die Inhalte des originals rüberkopieren und die Abhängigkeiten der einzelene Elemente neu nachbilden - d.h. die Zeiger anpassen!
max .. schrieb: > also es funktioniert. > > man muss sich eben einen "leeren" Baum erstellen und dann die Inhalte > des originals rüberkopieren dann machst du das aber kompliziert. Eine rekursive Funktion kann von einem gegebenen Baum eine Kopie während des Durchmarsches durch den Baum erzeugen. Dem Prinzip nach:
1 | XMLNODEPTR copyTree( XMLNODEPTR root ) |
2 | {
|
3 | int i; |
4 | XMLNODEPTR newRoot; |
5 | |
6 | if( root == NULL ) |
7 | return NULL; |
8 | |
9 | newRoot = malloc( sizeof( *root ) ); |
10 | newRoot->parentnode = NULL; |
11 | |
12 | // alle Nutzdaten dieses Knotens kopieren
|
13 | copyData( newRoot, root ); |
14 | |
15 | // und Duplikate von den Kindern anlegen,
|
16 | // falls es überhaupt welche gibt
|
17 | newRoot->nrChilds = root->nrChilds; |
18 | if( newRoot->nrChilds == 0 ) |
19 | newRoot->childnodes = NULL; |
20 | else { |
21 | newRoot->childnodes = malloc( newRoot->nrChilds * sizeof( XMLNODEPTR ) ); |
22 | for( i = 0; i < newRoot->nrChilds; ++i ) { |
23 | newRoot->childnodes[i] = copyTree( root->childnodes[i] ); |
24 | if( newRoot->childnodes[i] ) |
25 | newRoot->childnodes[i]->parentnode = newRoot; |
26 | }
|
27 | }
|
28 | |
29 | return newRoot; |
30 | }
|
Das hier
1 | typedef struct xmlnodestruct |
2 | {
|
3 | struct xmlnodestruct *parentnode; |
4 | struct xmlnodestruct **childnodes; // Array of xmlnodes |
5 | }
|
6 | XMLNODE; |
7 | |
8 | typedef XMLNODE *XMLNODEPTR; |
kann nicht dein Knoten sein. Da fehlt noch die Information, wie gross das Array der Childknoten ist. Ich hab mal noch einen Member 'nrChilds' angenommen.
dann haben wir uns falsch verstanden - denn exakt so mache ich es letztendlich auch. ich nehme an in der Funktion copyData() kopierst du die Inhalte (wie Kontennamen, KnotenWert,....) in den neuen Node! und ja klar - die Struktur beinhaltet nat. noch mehr infos (parentnode, childcount,....). Aber du hast wohl mehr mit dem Thema zu tun - da du das gut umgesetzt hast!!
...wenn man Strukturbäumen arbeitet braucht man eig. immer eine rekursive Funktion! Das ist hier bei dem Thema der Knackpunkt!
max .. schrieb: > Aber du hast wohl mehr mit dem Thema zu tun - da du das gut umgesetzt > hast!! :-) Mit XML hab ich nicht viel am Hut. Aber ich hab schon 'öfter' mit Bäumen zu tun und vor allen Dingen: Ich hab keine Angst vor rekursiven Funktionen :-)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.