2017-11-04 14 views
0

Ich erhalte einen Segmentierungsfehler, wenn ich versuche, die Knoten in meinem Binärbaum zu drucken. Es scheint ein Problem mit dem dritten Knoten zu sein. Ich habe google gesucht und stapeln Überlauf für Stunden, aber ich kann nicht verstehen, was das Problem ist. Ich versuche, mir Datenstrukturen in C beizubringen, und bin sehr viel Neuling, so dass ich etwas verpönt machen kann.Segmentierungsfehler 11 in c binärer Suchbaum

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

typedef struct node 
{ 
    int data; 
    struct node *left; 
    struct node *right; 
} Node; 

typedef struct 
{ 
    Node *root; 
} BinarySearchTree; 

void printInOrder(Node *); 
void addNode(Node *, Node *); 

int main (void) 
{ 
    BinarySearchTree tree; 
    BinarySearchTree *tree_ptr = &tree; 
    Node n1, n2, n3; 

    n1.data = 1; 
    n2.data = 2; 
    n3.data = 3; 

    Node *n1_ptr = &n1; 
    Node *n2_ptr = &n2; 
    Node *n3_ptr = &n3; 

    tree_ptr->root = n1_ptr; 

    addNode(tree_ptr->root, n2_ptr); 
    addNode(tree_ptr->root, n3_ptr); 
    printInOrder(tree_ptr->root); 
} 

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

void addNode(Node *root, Node *node) 
{ 
    if (node->data < root->data) 
    { 
    if (root->left == NULL) 
    { 
     root->left = node; 
    } else 
    { 
     addNode(root->left, node); 
    } 
    } 

    else if (node->data > root->data) 
    { 
    if (root->right == NULL) 
    { 
     root->right = node; 
    } else 
    { 
     addNode(root->right, node); 
    } 
    } 
} 

Ausgang:

1 
2 
Segmentation fault: 11 

Es scheint nicht ein Problem mit irgendwelchen, aber den dritten Knoten zu sein. Wenn ich die Zeile, die den zweiten Knoten hinzufügt, auskommentiere, bekomme ich den gleichen Fehler (natürlich wird nur 1 gedruckt).

+0

Wo initialisierst du die * full * 'Node' Struktur? Ich sehe nicht, dass Sie ihre "linken" oder "rechten" Zeiger irgendwo setzen. –

+0

Und was passiert, wenn in der Funktion 'add_node'' node-> data == root-> data'? –

+0

Mache ich etwas falsch mit der ersten Struktur? Oder beziehst du dich, wenn ich sie in der addNode-Funktion einstelle? Ich entschuldige mich, ich bin sehr neu in C und verstehe die Frage nicht ganz. – pariscraigm

Antwort

2

Ihre Initialisierung ist unvollständig

n1.data = 1; 
    n2.data = 2; 
    n3.data = 3; 

auch die Zeiger gesetzt sollte

n1.data = 1; 
    n1.left = NULL; 
    n1.right = NULL; 

    n2.data = 2; 
    n2.left = NULL; 
    n2.right = NULL; 

    n3.data = 3; 
    n3.left = NULL; 
    n3.right = NULL; 
+0

Gibt es einen Grund, warum ich das nicht für n1 und n2 tun muss? Der Segmentierungsfehler tritt nur beim dritten Knoten (n3) auf. – pariscraigm

+0

@parscraigm - Du sollst es für alle tun. Die Verwendung einer nicht initialisierten Variablen (Zeigervariable) kann zu einem Absturz führen, führt aber ** nicht ** immer zum Absturz. Die einzige sichere Sache ist es, vor der Verwendung zu initialisieren - immer. – 4386427

+0

Vielen Dank für Ihre Hilfe – pariscraigm

0

Problem auftritt, weil Sie nicht alle Mitglied der Struktur Node Typ Variable initialisiert.

Ich würde vorschlagen, sollten Sie eine Funktion schreiben, die Node Typ Variable zu initialisieren, wie folgt aus:

void init_node(Node * nodeptr, int data) 
{ 
     nodeptr->data = data; 
     nodeptr->left = NULL; 
     nodeptr->right = NULL; 
} 

und in Ihrem main() (oder von wo auch immer Sie initialisieren möchten) Sie einfach tun:

init_node(&n1, 1); 
    init_node(&n2, 2); 
    init_node(&n3, 3); 

Damit werden Sie verpassen nie NULL zu left und right Zeiger bei der Initialisierung von Node Typ Variable und Chancen der Fehler auftritt, b Zuweisen Dadurch wird es in einem größeren Umfang reduziert werden.