2017-11-04 148 views
0

嘗試打印二叉樹中的節點時出現分段錯誤。它看起來是第三個節點的問題。我搜索谷歌和堆棧溢出了幾個小時,但我不明白是什麼問題。我試圖在C中教自己的數據結構,並且非常適合初學者,所以我可能會在某種程度上做一些事情。c二叉搜索樹中的分段錯誤11

#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 

似乎沒有要與任何但是第三個節點的問題。如果我將添加第二個節點的行註釋掉,我會得到相同的錯誤(顯然,只打印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; 

還應該設置指針

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做這個工作?分段錯誤只發生在第三個節點(n3)。 – pariscraigm

+0

@pariscraigm - 你應該爲所有人做。使用未初始化的變量(指針變量)可能會導致崩潰,但不會**總是發生崩潰。唯一安全的是確保在使用之前進行初始化 - 始終如一。 – 4386427

+0

謝謝你的幫助 – pariscraigm

0

問題發生,因爲你不初始化結構Node類型變量的所有成員。

我建議,你應該寫一個函數來初始化Node類型變量,像這樣:

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

,並在您的main()(或任何你想要初始化),你可以簡單地做:

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

有了這個,你絕不會錯過Node類型變量和錯誤發生的b的機會初始化期間分配NULL來leftright指針因爲它會減少到更大的程度。