2017-06-17 2 views
-1

J'ai écrit l'arbre de recherche binaire par langage C, lequel est une chaîne de caractères, et j'ai un problème lorsque j'ai essayé de taper des données.Thread 1: EXC_BAD_ACCESS

Erreur d'affichage sur la ligne 14, je pense que root->data est NULL cause, mais je ne sais pas comment résoudre.

Ceci est mon code:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
struct Node { 
    Node *parent; 
    Node *left; 
    Node *right; 
    char *data; 
}; 
Node *insert(Node *root, char *data) { 
    if (root == NULL) { 
     Node *tmp; 
     tmp = (Node *)malloc(sizeof(Node)); 
     root->data = data; // <--- Line 14 
     tmp -> left = tmp -> right = NULL; 
     return tmp; 
    } 
    if (strcmp(data, root->data) > 0) { 
     root -> right = insert(root->right, data); 
    } else if (strcmp(data, root->data) < 0) { 
     root -> left = insert(root->left, data); 
    } 
    return root; 
} 

void Print(Node *root){ 
    if (root == NULL) return; 
    Print(root->left); 
    printf("%s\n", root->data); 
    Print(root->right); 
} 

int main() { 
    Node *root = NULL; 
    char input[21]; 
    while (scanf("%s", input) != EOF) { 
     root = insert(root, input); 
    } 
    Print(root); 
    return 0; 
} 
+0

Depuis 'root' est toujours nulle à ce moment-là, vous avez besoin de mettre' 'root' à tmp', ou - mieux - se débarrasser de 'tmp' et assigner le résultat de' malloc() 'à' root' à la place. Ou, de manière équivalente, changez 'root-> data' en' tmp-> data' puisque vous renvoyez actuellement 'tmp'. Vous devriez également vérifier que le 'malloc()' a réussi, bien sûr. Notez que les opérateurs point '.' et flèche' -> 'se lient très étroitement; ils ne devraient pas être écrits avec des espaces autour d'eux. Votre code ne définit pas 'parent'. Vous devrez faire une copie de la chaîne - voir ['strdup()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/strdup.html). –

Répondre

1

Dans votre fonction:

Node *insert(Node *root, char *data) { 
    if (root == NULL) { 
     Node *tmp;   // is this really needed? 
     tmp = (Node *)malloc(sizeof(Node)); // did your mean root = malloc(..) ? 
     root->data = data; // <--- root is always NULL, from test above 

/* ... */