2016-07-11 2 views
0

Я пытался реализовать обход предзаказов в двоичном дереве. Это мой фрагмент кода.Почему мой код показывает ошибку Ошибка сегментации (ядро сбрасывается)

#include <iostream> 
using namespace std; 

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

struct node *root= NULL; 

struct node *inorder_search(struct node *node, int val){ 
    inorder_search(node->left,val); 
    if(node->data==val) return node; 
    inorder_search(node->right,val); 
} 

void insert(int data1, int data2, char subtree){ 
    struct node *current; 
    struct node *temp1; 
    struct node *temp2; 

    temp1->data= data1; 
    temp1->left= NULL; 
    temp1->right= NULL; 

    temp2->data= data2; 
    temp2->left= NULL; 
    temp2->right= NULL; 

    if(root==NULL){ 
     root= temp1; 
     if(subtree=='R'){ 
     root->right= temp2; 
     return; 
     } 
     else{ 
     root->left= temp2; 
     return; 
     } 
    } 
    else{ 
     current= inorder_search(root,data1); 
     if(subtree=='R'){ 
     current->right= temp2; 
     return; 
     } 
     else{ 
     current->left= temp2; 
     return; 
     } 
    } 
    } 

void preorder_traversal(struct node *node){ 
    if(node==NULL) return; 
    cout<<node->data<<" "; 
    preorder_traversal(root->left); 
    preorder_traversal(root->right); 
} 

int main(void){ 
    int edges;//edges= no. of edges 
    cout<<"Enter the number of edges: "; 
    cin>>edges; 

    int i; 
    int relations= edges*3; 
    int *arr= new int[relations+1]; //since input is in the form 1 2 R 1 2 L where R= right subtree, L= left subtree 
    for(i=0; i<relations;i++) cin>>arr[i]; 

    for(i=0;i<relations;i+=3) insert(arr[i], arr[i+1], arr[i+2]); 

    preorder_traversal(root); 
} 

Код для следующего входного типа

1 2 L 1 3 R 

Функция вставки(), я пытаюсь создать дерево для ввода, которое было принято в виде массива. Функция inorder_search() используется для поиска конкретного узла, чье левое или правое поддерево, данные должны быть добавлены, который возвращается функции insert(). Например, в 1 2 L 1 3 R, '1' является узлом, к которому «2» и «3» являются соответственно левым и правым поддеревом. Поэтому я ищу «1» в функции inorder_search() и возвращает узел, в который соответственно вставлены «2» или «3» в функции insert().

Может кто-нибудь объяснить, где именно я ошибаюсь, и если есть лучший способ его реализовать?

+0

Это задание? –

+0

Используйте отладчик и проверьте исходный дамп. Где (stacktrace) это сбой? –

+2

Нет распределения нигде. Вы уверены в этом 'insert'? В любом случае, это больше C, чем C++. – Zeta

ответ

0

Похоже, что вы скомпилированы с отключенными предупреждениями. Когда я собирал это, я получил следующие сообщения:

$ g++ -std=c++14 -fPIC -g -Wall -Wextra -Wwrite-strings -Wno-parentheses -Weffc++  38307710.cpp -o 38307710 
38307710.cpp: In function ‘node* inorder_search(node*, int)’: 
38307710.cpp:16:1: warning: control reaches end of non-void function [-Wreturn-type] 
} 
^ 
38307710.cpp: In function ‘void insert(int, int, char)’: 
38307710.cpp:23:22: warning: ‘temp1’ is used uninitialized in this function [-Wuninitialized] 
    temp1->data= data1; 
        ^
38307710.cpp:27:22: warning: ‘temp2’ is used uninitialized in this function [-Wuninitialized] 
    temp2->data= data2; 
        ^

Кроме того, работает под Valgrind дает

==5113== Use of uninitialised value of size 8 
==5113== at 0x40093C: insert(int, int, char) (38307710.cpp:23) 
==5113== by 0x400B77: main (38307710.cpp:72) 
==5113== 
==5113== Invalid write of size 4 
==5113== at 0x40093C: insert(int, int, char) (38307710.cpp:23) 
==5113== by 0x400B77: main (38307710.cpp:72) 
==5113== Address 0x0 is not stack'd, malloc'd or (recently) free'd 
==5113== 
==5113== 
==5113== Process terminating with default action of signal 11 (SIGSEGV) 
==5113== Access not within mapped region at address 0x0 
==5113== at 0x40093C: insert(int, int, char) (38307710.cpp:23) 
==5113== by 0x400B77: main (38307710.cpp:72) 

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