Forum: PC-Programmierung C - Strukturbaum sortieren


von max .. (vbc2011)


Lesenswert?

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...

von Rolf Magnus (Gast)


Lesenswert?

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.

von max .. (vbc2011)


Lesenswert?

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!

von max .. (vbc2011)


Lesenswert?

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!

von Karl H. (kbuchegg)


Lesenswert?

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.

von max .. (vbc2011)


Lesenswert?

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!!

von max .. (vbc2011)


Lesenswert?

...wenn man Strukturbäumen arbeitet braucht man eig. immer eine 
rekursive Funktion! Das ist hier bei dem Thema der Knackpunkt!

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.