Binary Tree Problem
-
Hallo
Ich habe versucht ein Programm für einen Binärbaum zu schreiben, jedoch stürzt mir das Programm beim Eingeben/Ausgeben mancher Folgen Elementen immer ab mit einem Fehler in der ntdll.dll
Z.b wenn ich 3 neue Nodes eingebe : 9 , 1 , 10
Ich vermute der Fehler liegt wohl in der insertNode Funktion.
Habe hier mal den Code :
Ich bedanke mich jetzt schonmal.
#include<stdio.h> #include<stdlib.h> struct Node { int element; struct Node *left,*right; }*root; typedef struct Node *node; typedef int ElementType; node insertNode(ElementType, node); void display(node, int); void main() { char ch; ElementType a; while(1) // Hauptmenü mit Auswahlmöglichkeiten { printf("\n<e>... Element Einfuegen\n<a>... Sortierte Ausgabe\n<x>... Programm beenden\n\nWarte auf Auswahl : \n----------------------------\n"); scanf("%s",&ch); switch(ch) { case 'e': printf("\nGeben Sie ein Element ein : "); scanf("%d", &a); root = insertNode(a, root); break; case 'a': if(root==NULL) printf("\n Baum ist leer!"); else display(root, 1); break; case 'x': exit(0); default: printf("ERROR ! Unzulaessige Eingabe"); } } } //---------------------------------------------------------------------------------- INSERT node insertNode(ElementType x,node t) { if(t==NULL) { t = (node)malloc(sizeof(node)); t->element = x; t->left = t->right = NULL; } else { if(x > t->element) t->left = insertNode(x, t->left); else if(x < t->element) t->right = insertNode(x, t->right); } return t; } //---------------------------------------------------------------------------------- AUSGABE void display(node t,int level) { int i; if(t) { display(t->right, level+1); printf("\n"); for(i=0;i<level;i++) printf(" "); printf("%d", t->element); display(t->left, level+1); } }
-
Hier:
t = (node)malloc(sizeof(node));
allozierst du Speicher für einen Node-Zeiger, du gehst aber davon aus, dass dort eine Node-Struktur hinpasst. Ändern in:
t = malloc(sizeof(struct Node));
Noch ein Fehler (der aber hier zufällig nicht am Absturz schuld ist): Du liest mit scanf einen String in ein char ein. Du bekommst das eingegebene Zeichen und das abschließende Newline, das sind schon 2 Zeichen, also zuviel für ein char. Und wenn jemand noch mehr eingibt zerschießt du dir den ganzen Stack. Zur Einzelzeicheneingabe hat man getchar erfunden.
Stilanmerkungen:
* root sollte keine globale Variable sein
* node als Typedef auf struct Node* ist ziemlich ungünstig, man sieht ihm nicht an, dass es ein Zeiger ist (und macht dann solche Fehler wie du oben), ich würdetypedef struct Node { ... } Node;
schreiben und dann explizit mit
Node*
(ohne gesonderten Pointer-Typedef) arbeiten.
* den malloc-Rückgabewert muss und sollte man nicht casten (falls doch benutzt du einen C++-Compiler, dann solltest du ihn entweder in den C-Modus schalten oder gleich C++ programmieren)
* den typedef für ElementType finde ich etwas unglücklich, in der Struktur ist der Elementtyp ja schon als int vorgegeben, was für eine Funktion soll dieser typedef denn haben?
-
Hallo
Danke, habe den Fehler beheben können !
Danke auch für die Tips bezüglich den Zeigern.
Setze mich damit erst ca. eine Woche auseinander und muss mich da noch etwas mehr damit befassen.lg