2013-07-08 147 views
0

在這裏,我已經寫了這將插入數字二叉樹代碼。但它給分段錯誤錯誤。 並且還寫着「注意:預期‘結構樹*’,但參數的類型爲‘結構節點*’」,在第8行 下面是代碼: -二叉樹分割故障

#include<stdio.h> 
#include<stdlib.h> 
struct tree{ 
    int data; 
    struct tree *left; 
    struct tree *right; 
}; 

struct tree* insert(struct tree* node, int data) 
{ 
    if(!node){ 
    node=malloc(sizeof(struct tree)); 
    node->data=data; 
    node->left=node->right=NULL; 
    return node; 
    } 
    else { 
    if(data>node->data){ 
    node->right= insert(node->right,data); 
    return node; 
    } 
    else{ 
    node->left= insert(node->left,data); 
    } 
return node; 
    } 
} 
printtree(struct tree* node) 
{ 
    if(node){ 
     printf("%d",node->data); 
    } 
     printtree(node->left); 
     printtree(node->right); 

} 
main() 
{ 
int i,n; 
struct tree *NODE; 
NODE= insert(NODE,5); 
NODE= insert(NODE,3); 
NODE= insert(NODE,8); 
printtree(NODE); 
} 
+1

凡被定義'結構node'? – Kninnug

+0

嘗試使用警告進行編譯,以查看可以立即修復的錯誤。 – Nobilis

+3

錯誤太多。作爲佈雷特·黑爾指出,'結構樹* node'將不會被初始化,'結構樹* treenode'沒有任何地方使用,而且我也相信,在結構定義,既'結構node'應該是'結構tree' –

回答

2

局部變量:struct tree* node;不初始化,因此if (!node)測試將具有未定義的行爲。除非您爲其指定或使用它來保存malloc'd節點,否則else塊中的表達式會嘗試取消引用未初始化的指針。


您也應該習慣想法,一個樹可以被認爲是一種「遞歸」結構,因此任何節點一棵樹,頂級樹只是一個節點。這裏沒有兩種不同類型的理由。

+0

我已經更改了代碼,但仍然給出了分段錯誤。替換「樹」的「節點」是一個錯字錯誤 – user2456752

4

您使用if(node)但最好使用if(node != NULL)

您使用if(!node)但最好使用if(node == NULL)

它使代碼更易讀。

你有這麼多的錯誤 - 所以...我讓我的方式(我的代碼格式化等)。

printtree(node->left); printtree(node->right);在外面if(node != NULL){}所以它試圖讓NULL->leftNULL->right

測試 - 代碼作品。

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

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

struct tree* insert(struct tree* node, int data) 
{ 
    if(node == NULL) { 
     node = malloc(sizeof(struct tree)); 
     node->data = data; 
     node->left = node->right = NULL; 
    } else { 
     if(data > node->data){ 
      node->right = insert(node->right, data); 
     } else { 
      node->left = insert(node->left, data); 
     } 
    } 

    return node; 
} 

void printtree(struct tree* node) 
{ 
    if(node != NULL){ 
     printf("%d\n", node->data); 
     printtree(node->left); 
     printtree(node->right); 
    } 
} 

int main() 
{ 
    struct tree *NODE = NULL; 

    NODE = insert(NODE, 5); 
    NODE = insert(NODE, 3); 
    NODE = insert(NODE, 8); 

    printtree(NODE); 

    return 0; 
} 
+0

是的,它現在有效。謝謝你的方式。 if語句存在問題,但現在很好! :)而辦法,我寫明如果條件「如果(節點)」的作品,以及 – user2456752

+0

'如果(節點)'工作正常 - 它可以爲其他人只能少可讀(初學者,教師測試您的knowlege;))您可以隨時將我的答案標記爲已接受。 – furas

+0

+1這是一個很好的例子。 @ user2456752 - 'if(value)'真* *只能用於整數T/F(不是0/0)測試。對於NULL指針來說這不是一個好習慣,即使它是合法的,它也會使代碼大量使用指針,難以閱讀。 –

1

您仍然在通過值傳遞NODE的錯誤。如果你想修改它,你必須使用指向該指針的指針。

#include<stdio.h> 
#include<stdlib.h> 
typedef struct t 
{ 
    int data; 
    struct t *left; 
    struct t *right; 
}tree; 

tree* insert(tree **node, int data) 
{ 
    if(!(*node)) 
    { 
     *node=malloc(sizeof(tree)); 
     (*node)->data=data; 
     (*node)->left=(*node)->right=NULL; 
     return *node; 
    } 
    else 
    { 
     if(data>(*node)->data) 
     { 
      (*node)->right = insert(&((*node)->right),data); 
      return *node; 
     } 
     else 
     { 
      (*node)->left = insert(&((*node)->left),data); 
      return *node; 
     } 
    } 
} 

void printtree(tree *node) 
{ 
    if(node) 
    { 
     printf("%d",node->data); 
     printtree(node->left); 
     printtree(node->right); 
    } 
} 

void freeMemory(tree *node) 
{ 
    if(node) 
    { 
     freeMemory(node->left); 
     freeMemory(node->right); 
     free(node); 
    } 
} 

int main() 
{ 
    tree *NODE = NULL; 
    NODE= insert(&NODE,5); 
    NODE= insert(&NODE,3); 
    NODE= insert(&NODE,8); 
    printtree(NODE); 
    freeMemory(NODE); 
    return 0; 
} 

鏈接:http://ideone.com/OpZWiC

+0

他將節點指針作爲結果返回並分配給NODE - 他不需要'指向指針'的指針。但是他應該用'pointer to pointer'做這個,因爲它更好用;} – furas

+0

評論收回^ _ ^,但是他真的應該使用'pointer to pointer' :) –