Rekurison mit Struct
-
Hallo!
Ich möchte bei einem Baum Rekursiv alle Knoten besuchen.
Der Struct ist wie folgt deklariert:struct TKnoten
{
struct TKnoten* links;
struct TKnoten* rechts;
int haufigkeit;
int zeichen;
};der Aufruf ist:
BinCodeSuchen(knotenliste[0],"");
und die Funktion:
int BinCodeSuchen(struct TKnoten laufknoten,char* wort)
{struct TKnoten linkerK;
struct TKnoten rechterK;if (laufknoten.links != NULL)
{linkerK=laufknoten.links;
rechterK=laufknoten.rechts;BinCodeSuchen(linkerK,wort+'0');
BinCodeSuchen(rechterK,wort+'1');
}
else
{
printf("%c %s",laufknoten.zeichen,wort);
}return 0;
}Was habe ich hier falsch gemacht? Ich bekomme immer die Fehlermeldung
(in der markierten spalte) inkompatible typen, obwohl doch beide vom typ tknoten sind..bitte helft mir!
-
Du musst linkeK und rechterK als Zeiger auf TKnoten deklarieren, denn die bekommst du zurück.
laufknoten.links sollte auch nicht gehen.
laufknoten->links wäre hier richtig.
-
Also das klappt jetzt soweit (mit ein paar Warnings..)
Ich habe die Funktion jetzt so geändert:
int BinCodeSuchen(struct TKnoten *pKnoten,char* wort) { if (pKnoten->links != NULL) { printf("%d",pKnoten->haufigkeit); BinCodeSuchen(pKnoten->links,wort+'0'); BinCodeSuchen(pKnoten->rechts,wort+'1'); } else { printf("%c %s",pKnoten->zeichen,wort); } return 0; }
Ich habe jetzt das Problem, dass wenn ich die Häufigkeiten in meinen Baum durchgehe irgendwie nur in den rechten Teilbaum geschrieben wurde.. im linken steht immer nur der selber Wert drin.
Mein Programm soll so eine Art Huffmann Kompression werden und ich sortiere meine Knoten wie folgt:
int KnotenVerknuepfen(void) { struct TKnoten tempknoten; while (maximal > 0) { tempknoten.links = &knotenliste[maximal-1]; tempknoten.rechts = &knotenliste[maximal]; tempknoten.haufigkeit = knotenliste[maximal].haufigkeit + knotenliste[maximal-1].haufigkeit; printf("\nFüge Knoten zusammen : %d %d",knotenliste[maximal].haufigkeit,knotenliste[maximal-1].haufigkeit); getch(); maximal--; knotenliste[maximal] = tempknoten; KnotenSortieren(); } return 0; }
Diese Funktion soll Knoten die in einer Liste sind zusammenfügen. Und zwar immer die mit der geringsten Häufigkeit.
Die Knoten werden anhand einer Häufigkeitstabelle mit dieser Funktion in die Knotenliste geschrieben:maximal = -1; for (i=0;i<=255;i++) if (haufigkeiten[i]!=0) { maximal++; knotenliste[maximal].haufigkeit= haufigkeiten[i]; knotenliste[maximal].zeichen = i; knotenliste[maximal].rechts = NULL; knotenliste[maximal].links = NULL; printf ("%d %d \n",knotenliste[maximal].zeichen,knotenliste[maximal].haufigkeit); }
Es ist schwer zu beschreiben aber ich hoffe mal das jemand mein Problem versteht und mit helfen kann!
mfg