Seite 1 von 2
c:tree:binarysearch
Verfasst: Mi Dez 23, 2009 11:53 am
von stampuhh
Heyo,
also ich hänge ja mehr oder weniger immer noch bei den Bäumen fest mit dem Lernen. Habe ja auch schon hier:
http://forum.proggen.org/viewtopic.php? ... 156#p10818
ein wenig Code zu dem Thema gepostet. Könnte man das vielleicht etwas aufgearbeitet im Tutorial übernehmen? Oder ist das eh ganz falsch?
Es steht jetzt schon seit längerer Zeit "IN BEARBEITUNG" vor dem ganzen Kapitel Bäume. Wenn ich das richtig gesehen habe hat sich da jedoch nichts getan die letzten Wochen. Kann ja auch sein dass du (Xin) schon alles offline fertig hast nur noch eingefügt
Funktionen die man für so einen binären Suchbaum sind wären ja:
- einfügen
- löschen
- suchen
- ausgeben
- Hilfsfunktionen für diese
gruß stampuhh
Re: c:tree:binarysearch
Verfasst: Do Dez 24, 2009 1:17 pm
von Xin
stampuhh hat geschrieben:also ich hänge ja mehr oder weniger immer noch bei den Bäumen fest mit dem Lernen. Habe ja auch schon ... ein wenig Code zu dem Thema gepostet. Könnte man das vielleicht etwas aufgearbeitet im Tutorial übernehmen? Oder ist das eh ganz falsch?
Ich gebe zu, ich habe es nicht ausprobiert, ich bin an zu vielen anderen Ecken gerade dran.
stampuhh hat geschrieben:Es steht jetzt schon seit längerer Zeit "IN BEARBEITUNG" vor dem ganzen Kapitel Bäume. Wenn ich das richtig gesehen habe hat sich da jedoch nichts getan die letzten Wochen. Kann ja auch sein dass du (Xin) schon alles offline fertig hast nur noch eingefügt

Da muss ich Dich leider enttäuschen. Ich habe gerade mal geguckt, wann ich da zuletzt dran war, das ist schon gut über ein Jahr her. Das letzte Jahr war viel Stress für mich, deswegen ist gerade bei proggen.org von meiner Seite sehr viel liegen geblieben. Dazu gehört auch der Artikel über den Baum.[/quote]
Ich gucke aber mal, ob ich die Grundlagen vom Bäumen die Tage flott hinbekomme.
Re: c:tree:binarysearch
Verfasst: Do Dez 24, 2009 2:40 pm
von stampuhh
ich war schon am überlegen ob ich wenn ich Zeit habe mir nicht vielleicht was einfallen lasse. Dafür müsste ich nur wissen ob der Code den ich da oben stehen habe überhaupt sinnvoll ist. Dann könnte ich "drum herum" erst mal ein wenig was schreiben was man als Anfang nehmen könnte...
gruß stampuhh!!
Re: c:tree:binarysearch
Verfasst: Do Dez 24, 2009 2:59 pm
von Xin
stampuhh hat geschrieben:ich war schon am überlegen ob ich wenn ich Zeit habe mir nicht vielleicht was einfallen lasse. Dafür müsste ich nur wissen ob der Code den ich da oben stehen habe überhaupt sinnvoll ist. Dann könnte ich "drum herum" erst mal ein wenig was schreiben was man als Anfang nehmen könnte...
Ich packe den Code morgen mal in ein Projekt und dann gucke ich ihn mir mal in einem richtigen Editor an.
Jetzt bin ich quasi startklar, um Weihnachten zu beginnen. Hück jitt datt nix mieh. ^^
Re: c:tree:binarysearch
Verfasst: Do Dez 24, 2009 4:13 pm
von stampuhh
Eilt ja nicht
Hier schauts genauso aus, nur mit Dialekt kann ich leider nicht glänzen
gruß stampuhh
Re: c:tree:binarysearch
Verfasst: Fr Dez 25, 2009 10:47 am
von Xin
So.... ich habe mich dann mal dran gegeben... und jetzt mache ich das ganze mal in C... zwischendurch fiel mir auf, dass 'class' in C gar nicht so gut ankommt ^
Re: c:tree:binarysearch
Verfasst: Sa Dez 26, 2009 5:09 pm
von Xin
Ich werde den Code mal als Vergleich rein - er ist bisher weder sinnvoll getestet, noch sonstwas, nur um mal drüberzusehen.
Code: Alles auswählen
#include <stdio.h>
#include <stdlib.h>
struct BinaryTreeRoot
{
struct BinaryTree * RootElement;
};
struct BinaryTree
{
struct BinaryTree *Superiour;
struct BinaryTree *Left, *Right;
int Key;
};
struct BinaryTree * CreateElement( int key )
{
struct BinaryTree * result = malloc( sizeof( struct BinaryTree ) );
if( result )
{
result->Superiour = NULL;
result->Left = NULL;
result->Right = NULL;
result->Key = key;
}
return result;
}
/* Arguments must be valid! */
void insertElement( struct BinaryTree * super, struct BinaryTree * element )
{
if( super->Key < element->Key )
if( super->Left )
insertElement( super->Left, element );
else
{
super->Left = element;
element->Superiour = super;
}
else
if( super->Right )
insertElement( super->Right, element );
else
{
super->Right = element;
element->Superiour = super;
}
}
/* Arguments must be valid! */
void insert( struct BinaryTreeRoot * root, struct BinaryTree * element )
{
if( root->RootElement == NULL )
root->RootElement = element;
else
if( root->RootElement->Key < element->Key )
if( root->RootElement->Left )
insertElement( root->RootElement->Left, element );
else
{
root->RootElement->Left = element;
element->Superiour = root->RootElement;
}
else
if( root->RootElement->Right )
insertElement( root->RootElement->Right, element );
else
{
root->RootElement->Right = element;
element->Superiour = root->RootElement;
}
}
void PrintTreeInternal( struct BinaryTree * element, int indent, char from )
{
if( element )
{
PrintTreeInternal( element->Left, indent + 1, 'l' );
int i;
for( i = 0; i < indent; i++ )
printf( " " );
switch( from )
{
case 'l': printf( "/-> %d\n", element->Key ); break;
case 'r': printf( "\\-> %d\n", element->Key ); break;
default: printf( "--> %d\n", element->Key ); break;
}
PrintTreeInternal( element->Right, indent + 1, 'r' );
}
}
/* Arguments must be valid! */
void PrintTree( struct BinaryTreeRoot * root )
{
PrintTreeInternal( root->RootElement, 0, '-' );
}
struct BinaryTree * Search( struct BinaryTreeRoot * root, int key )
{
struct BinaryTree * result = root->RootElement;
while( result )
{
if( result->Key == key )
break;
if( result->Key < key )
result = result->Left;
else result = result->Right;
}
return result;
}
void DeleteElement( struct BinaryTreeRoot * root, struct BinaryTree * element, int recursive )
{
if( recursive )
{
if( element->Left ) DeleteElement( root, element->Left, 1 );
if( element->Right ) DeleteElement( root, element->Right, 1 );
}
else
{
if( element->Superiour == root->RootElement )
root->RootElement = NULL;
else if( element->Superiour->Left == element )
element->Superiour->Left = NULL;
else
element->Superiour->Right = NULL;
if( element->Left ) insert( root, element->Left );
if( element->Right ) insert( root, element->Right );
free( element );
}
}
void Delete( struct BinaryTreeRoot * root, int key, int recursive )
{
struct BinaryTree * result = Search( root, key );
if( result )
{
DeleteElement( root, result, recursive );
}
}
int main( void )
{
struct BinaryTreeRoot root;
struct BinaryTree * element;
int init[] = { 3,7,8,2,6,4,5,2,9, -1 };
/* Initialisation */
printf( "\n--- Initialisierung--------------------------\n\n" );
int i=0;
while( init[i] >= 0 )
{
element = CreateElement( init[i] );
if( element )
insert( &root, element );
i++;
}
printf( "\n--- Ausgabe ---------------------------------\n\n" );
PrintTree( &root );
printf( "\n--- Suche -----------------------------------\n\n" );
element = Search( &root, 4 );
printf( "gefunden: %d\n", ( element == NULL ) ? -1 : element->Key );
element = Search( &root, 14 );
printf( "gefunden: %d\n", ( element == NULL ) ? -1 : element->Key );
printf( "\n--- Löschen---------------------------------\n\n" );
Delete( &root, 6, 0 );
printf( "\n--- Ausgabe ---------------------------------\n\n" );
PrintTree( &root );
return 0;
}
Re: c:tree:binarysearch
Verfasst: Sa Dez 26, 2009 7:07 pm
von stampuhh
schon mal eine schnelle Antwort ohne groß angeschaut zu haben. Lässt sich compilieren liefert aber bei der Ausführung nen Segmentation fault. Die while-Schleife in der main wird kein einziges Mal durchlaufen.
Gucke mir das jetzt mal genauer an.
edit. Ich habe keine Ahnung wo das Problem liegt. Es tritt bei mir in der while Schleife bei der Zuweisung element = CreateElement() auf. Allerdings läuft die Funktion bis zum Ende durch und praktisch beim return kommt der Fehler.
gruß stampuhh
Re: c:tree:binarysearch
Verfasst: So Dez 27, 2009 10:57 am
von stampuhh
So der Fehler liegt in der InsertElement(). Und zwar kommt es beim ersten Mal aufrufen irgendwie dazu dass "super->Key" nicht existiert.
Habe darauf die main()-Funktion geändert und jetzt läuft es. Also eigentlich nur aus root einen Zeiger gemacht und malloc.
Code: Alles auswählen
int main( void )
{
struct BinaryTreeRoot * root = malloc( sizeof( struct BinaryTreeRoot ) );
struct BinaryTree * element = NULL;
int init[] = { 3,7,8,2,6,4,5,2,9, -1 };
int i=0;
/* Initialisation */
printf( "\n--- Initialisierung--------------------------\n\n" );
while( init[i] >= 0 )
{
element = CreateElement( init[i] );
if( element )
insert( root, element );
i++;
printf( "\n--- %d\n\n",i
);
}
printf( "\n--- Ausgabe ---------------------------------\n\n" );
PrintTree( root );
printf( "\n--- Suche -----------------------------------\n\n" );
element = Search( root, 4 );
printf( "gefunden: %d\n", ( element == NULL ) ? -1 : element->Key );
element = Search( root, 14 );
printf( "gefunden: %d\n", ( element == NULL ) ? -1 : element->Key );
printf( "\n--- Löschen---------------------------------\n\n" );
Delete( root, 6, 0 );
printf( "\n--- Ausgabe ---------------------------------\n\n" );
PrintTree( root );
return 0;
}
gruß stampuhh
Re: c:tree:binarysearch
Verfasst: So Dez 27, 2009 12:22 pm
von Xin
stampuhh hat geschrieben:So der Fehler liegt in der InsertElement(). Und zwar kommt es beim ersten Mal aufrufen irgendwie dazu dass "super->Key" nicht existiert.
Habe darauf die main()-Funktion geändert und jetzt läuft es. Also eigentlich nur aus root einen Zeiger gemacht und malloc.
Das kann in keinem Fall eine Lösung sein.
Weiterhin vergisst Du root wieder freizugeben.
Beschreibe mir mal Deine Entwicklungsumgebung, damit ich das nachvollziehen kann.