2013-11-24 61 views
0
#include<stdio.h> 
#include<stdlib.h> 

typedef struct BTreeNode BTNode; 
struct BTreeNode 
{ 
int value; 
struct BTreeNode *left_child,*right_child; 
}; 

int insert(int input_value, BTNode *head_node) 
{ 
    BTNode *temp,*head; 
    temp->value = input_value; 
    temp->left_child = NULL; 
    temp->right_child = NULL; 
    head = head_node; 
// while(1) 
    { 
     if(head == NULL) 
     { 
      head = temp; 
//   break; 
      return 0; 
     } 
     if(temp->value > head->value) 
     { 
      head = head->right_child; 
     } 
     else if(temp->value < head->value) 
     { 
      head = head->left_child; 
     } 
     else 
     { 
//   break; 
     } 
      printf("Inserted successfully\n"); 
    } 
    return 1; 
} 

int main() 
{ 
    BTNode *root=NULL; 
    insert(23,root); 
} 

我試圖在二進制搜索樹中插入一個新值。 在下面的代碼中,我在「temp-> left_child = NULL;」處得到分段錯誤。行插入功能。我不明白爲什麼我得到那個人可以幫我嗎?分段錯誤當分配NULL到BinaryTree中的子節點時

回答

0

temp = malloc (sizeof (BTNode))

你永遠不分配給地方temp點,所以它試圖將數據保存到內存 不屬於它的空間 。這導致意想不到的行爲。你很幸運,你有分段錯誤。

注意:你打算如何改變樹的根?我不能 從你的代碼中得出這個數字。也許你可以每次都從你的函數返回根節點 ,比如:BTNode* insert(int input_value, BTNode *head_node) 或者使用雙指針,如:int insert(int input_value, BTNode **head_node)和 做*head_node裏面的insert。看看here瞭解指針 和C中的內存分配。

+0

由於我們在工作的指針我們不能用根主爲根永遠因爲我們正在插入考慮根作爲二叉樹根的值? – sr116

+0

我的意思是說,指針上做的更改將具有全局scope.so,我們是否需要再次返回根? – sr116

0

當然,內存分配丟失。你傳遞一個參數root,它對你的函數是NULL,然後你聲明一個指針temp沒有任何內存分配,然後你解除引用它 - 沒有用。

0
BTNode *temp,*head; 
temp->value = input_value; 

正在使用Temp而未分配空間。所以它應該是:

BTNode *temp,*head; 
temp = malloc(sizeof(BTreeNode)); 
temp->value = input_value; 
0

沒有內存分配給溫度。你應該這樣做,如:

BTNode * createNode() 
{ 
return ((node *)malloc(sizeof(node))); 
} 

int insert(int input_value, BTNode *head_node) 
{ 
    BTNode *temp,*head; 
    temp = createNode(); 
    temp->value = input_value; 
    temp->left_child = NULL; 
    temp->right_child = NULL; 
} 
0

分配內存來臨時節點first.It應該是這樣的,

BTNode *temp,*head; 
    temp = malloc(sizeof(BTNode)); 
    temp->value = input_value; 
    temp->left_child = NULL; 
    temp->right_child = NULL;