2017-11-04 25 views
0

バイナリツリーのノードを印刷しようとすると、セグメンテーションフォルトが発生します。それは3番目のノードで問題に見えます。私はGoogleを検索し、何時間もスタックのオーバーフローが発生しましたが、問題の内容を理解できません。私は自分自身でCでデータ構造を教えようとしており、非常に初心者ですので、私は何か面倒なことをしているかもしれません。セグメンテーションフォールト11 in cバイナリ検索ツリー

#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); 
    } 
    } 
} 

出力:

1 
2 
Segmentation fault: 11 

第3のノードが、任意の問題があるように思えません。 2番目のノードを追加する行をコメントアウトすると、同じエラーが表示されます(明らかに1つしか表示されません)。

+0

* full * 'Node'構造体はどこで初期化しますか?私は、あなたが左または右のポインタをどこにでも置くことを見ません。 –

+0

'add_node'関数の' node-> data == root-> data'の場合はどうなりますか? –

+0

最初の構造体に何か問題がありますか?または、あなたがaddNode関数でそれらを設定したときを指していますか?私はCにはとても新しいので謝罪し、質問を完全に理解していない。 – pariscraigm

答えて

2

あなたの初期化が不完全である

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

はまた、あなたが構造Node型変数のすべてのメンバーを初期化されていないため、

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

n1とn2でこれを行う必要がないのはなぜですか?セグメンテーション障害は第3のノード(n3)でのみ発生する。 – pariscraigm

+0

@pariscraigm - あなたはすべてのためにそれをしなければならない。初期化されていない変数(ポインタ変数)を使用するとクラッシュする可能性がありますが、常にクラッシュしません。唯一安全なのは、使用する前に必ず初期化することです。 – 4386427

+0

ありがとうございます – pariscraigm

0

問題が発生しているポインタを設定する必要があります。

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

とあなたのmain()中(または初期化したい、これまでどこから)あなたは、単に行うことができます:

私はお勧めし

、あなたはこのように、Node型の変数を初期化する関数を記述すべきですこれにより

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

、あなたはNode型変数とエラー発生Bのチャンスの初期化中にleftrightポインタにNULLを割り当てる見逃すことはありませんそれを念頭において、より大きな範囲に縮小されるでしょう。

関連する問題