2015-08-09 3 views
-2

Я пытаюсь сделать BST из заданного массива, а затем пересечь его в порядке. Ошибок компиляции нет, но во время выполнения ошибка равна Ошибка сегментации (сбрасывается ядром). Я не смог выяснить причину ошибки (попытался просмотреть stackoverflow для подобных случаев). Код выглядит следующим образом:Ошибка: ошибка сегментации (сбрасывается сердечник) || Вставка элемента в BST || C

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

    struct TreeNode{ 
    int data; 
    struct TreeNode *right; 
    struct TreeNode *left; 
    }; 
    struct TreeNode *newTreeNode(){ 
    struct TreeNode *node = malloc(sizeof(struct TreeNode)); 
    if(node){ 
     node->data = 0; 
     node->left = NULL; 
     node->right = NULL; 
     return node; 
    } 
    else{ 
     printf("Memory Error"); 
    } 
    }; 
    void InorderTraversalRecursive(struct TreeNode *node){ 
    InorderTraversalRecursive(node->left); 
    printf("%d",node->data); 
    InorderTraversalRecursive(node->right); 
    } 

    struct TreeNode *InsertIntoTree(struct TreeNode *node, int data){ 
    if(node == NULL){ 
    node = newTreeNode(); 
    node->data = data; 
    node->left = node->right = NULL; 
    } 
    else{ 
     if(data > node->data) 
     InsertIntoTree(node->right, data); 
    else if(data < node->data) 
     InsertIntoTree(node->left, data); 
    } 
    return node; 
    } 

    struct TreeNode *MakeTreeFromData(int *arr){ 
    int size = sizeof(arr)/sizeof(arr[0]); 
    struct TreeNode *root; 
    root = newTreeNode(); 

    int i; 
    for(i=0;i<size;i++){ 
     InsertIntoTree(root,arr[i]); 
    } 
    return root; 
    } 

    void main(){ 
    int data[] = {4,2,6,1,7,3,5,8}; 
    struct TreeNode *root; 
    root = MakeTreeFromData(data); 
    InorderTraversalRecursive(root); 
    } 
+2

Вы не должны смотреть на SO для этого, но использовать отладчик. –

+0

Цель sizeof() - не считать размер массива. Попробуйте: 'int size = 8' в вашем примере. – nsvir

ответ

1

Одна очевидная ошибка в этой строке

int size = sizeof(arr)/sizeof(arr[0]); 

где arr не массив, а указатель. Это не делает вообще то, что вы думаете, что это делает. Вам нужно передать размер вашего массива в качестве параметра вашей функции.

2

Еще одна ошибка в функции InorderTraversalRecursive. Код должен быть:

void InorderTraversalRecursive(struct TreeNode *node) 
{ 
    if(!node) 
     return; 
    InorderTraversalRecursive(node->left); 
    printf("%d",node->data); 
    InorderTraversalRecursive(node->right); 
} 

Это устранило бы ошибку сегментации.

Вы должны передать размер массива в функции MakeTreeFromData(). Так декларация становится

struct TreeNode *MakeTreeFromData(int *arr,int size) 

, где размер рассчитывается по той же формуле, но внутри основной и затем передается функции.

Кроме того, функция InsertIntoTree() должна быть определена как

struct TreeNode *InsertIntoTree(struct TreeNode *node, int data) 
{ 
    if(node==NULL) 
    { 
     node = newTreeNode(); 
     node->data = data; 
     node->left = node->right = NULL; 
    } 
    else 
    { 
     if(data >= node->data) 
      node->right = InsertIntoTree(node->right, data); 
      else 
      node->left = InsertIntoTree(node->left, data); 
    } 
    return node; 
} 

И вуаля вы получите правильный выход !!!

0

Если у вас есть один мощный инструмент, чтобы знать, когда кодирование в C равно GDB. Прочитайте несколько руководств, и вам не нужно будет задавать эти вопросы. В моем личном опыте я любил опыт gdb с emacs.

Смежные вопросы