2016-04-23 21 views
-1

Ich habe ein Problem mit dem Schreiben von BST in C. Ich bekomme immer einen Segmentierungsfehler Fehler. Ich glaube, dass das Problem von der Funktion insertNode herrührt. Ich fügte printf() Anweisungen in der Funktion und direkt nach dem Funktionsaufruf hinzu, um zu sehen, ob der newNode hinzugefügt wurde. Bitte ignorieren Sie den Rest des Codes, da er noch nicht fertig ist. Versuchen Sie nur, die insertNode-Funktion zu aktivieren.Binäre Suchbaum in C, Segmentierung Fehler Fehler

#include <stdio.h> 
#include <stdlib.h> 

//structure for node 
struct btNode { 
    int data; 
    struct btNode *left; 
    struct btNode *right; 
}; 

//prototypes 
struct btNode* createNode(int x); 
void insertNode(struct btNode *tree, struct btNode *root); 

int main(){ 
    int x,n=-1,i=0; //local variables 

    struct btNode *head=NULL; 

    while (n <= 0){ 
     printf("Enter the number of nodes in the Tree(>0): "); 
     scanf("%i", &n); 
    } 


    while(i < n){ 
     printf("Enter an integer: "); 
     scanf("%i", &x); 
     struct btNode *newNode=createNode(x); 
     insertNode(head,newNode); 
     printf("%d",head->data); //breaks program here???? 

     i++; 
    } 

    while (x < 0){ 
     printf("Enter a integer from 0-5: "); 
     scanf("%i",&x); 

     if (x == 0){ 
      printf("Program Exit.\n"); 

      exit(0); 

     }else if(x==1){ 


     }else if(x==2){ 


     }else if(x==3){ 

     }else if (x==4){ 

     }else if(x==5){ 

     } 

     x=-1; 
    } 

    return 0; 
} 

//creates and returns a pointer to a new node 
struct btNode* createNode(int x) 
{ 
    struct btNode *newNode; 
    newNode=(struct btNode*)malloc(sizeof(struct btNode)); 

    if (newNode == NULL){ 
     printf("Memory Allocation Failed./n"); 
     exit(20); 
    }else{ 
     newNode->data=x; 
     newNode->left=NULL; 
     newNode->right=NULL; 
     return newNode; 
    } 
} 


void insertNode(struct btNode *tree, struct btNode *newNode){ 
    if (tree==NULL){ 
     tree=newNode; 
     printf("%d",tree->data); //works fine here! 
    }else if(tree->data <= newNode->data){ 
     insertNode(tree->right, newNode); 
    }else if(tree->data > newNode->data){ 
     insertNode(tree->left, newNode); 
    } 
} 
+0

Sie sollten den Rückgabewert von 'Scanf testen()'; Ihr Programm wird nicht aufhören, wenn es EOF - oder eine Nicht-Ziffer (z. B. "a") - in der ersten Schleife bekommt. Testen Sie immer das Ergebnis von 'scanf()' usw. Wenn Sie einen Wert erwarten, testen Sie, dass es '1' zurückgibt; es könnte "0" zurückgeben (was anzeigt, dass keine Eingabe erfolgte) oder "EOF". –

+1

Diese Frage ist effektiv ein Duplikat von vielen anderen - Listen und Bäume laufen beide in das grundlegende Problem von "Wie bekomme ich die Informationen zurück zum aufrufenden Code". –

Antwort

1

Sie haben die node zurückzukehren, nachdem Sie es in Ihre Baumstruktur einfügen. So Ihre korrekte Funktion ist:

struct btNode *insertNode(struct btNode *tree, struct btNode *newNode){ 
    if (tree==NULL){ 
     tree=newNode; 
     printf("%d", tree->data); //works fine here! 
     return tree; 
    }else if(tree->data <= newNode->data){ 
     tree->right = insertNode(tree->right, newNode); 
     return tree; 
    }else if(tree->data > newNode->data){ 
     tree->left = insertNode(tree->left, newNode); 
     return tree;  
    } 
} 

auch Ihren Anruf ändern:

head = insertNode(head, newNode); 
+0

Oder haben Sie einfach die Funktion nehmen 'struct btNode ** tree' als @OldProgrammer impliziert. –

+0

@ JonathanLeffler Ich habe meinen Freund. –

+0

Also ich sehe; Es erschien nicht (für mich, weil ich HTTPS Everywhere verwende), bis ich zum Bearbeiten ging ... –

Verwandte Themen