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ürde

    typedef 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


Anmelden zum Antworten