2017-05-28 20 views
4

バイナリツリーにノードを挿入、削除、検索、および印刷するために、次のライブラリを作成しました。バイナリツリーにノードを挿入するときにプログラムがクラッシュする

#include <stdlib.h> 

struct NODE 
{ 
    int code; 
    char subject[20]; 
    struct NODE *left; 
    struct NODE *right; 
}; 


void InOrder(struct NODE *R) 
{ 
    if (R==NULL) 
    return; 
    InOrder(R->left); 
    printf("%d %s\n",R->code,R->subject); 
    InOrder(R->right); 
} 

void PreOrder(struct NODE *R) 
{ 
    if (R==NULL) 
    return; 
    printf("%d %s\n",R->code,R->subject); 
    InOrder(R->left); 
    InOrder(R->right); 
} 

void PostOrder(struct NODE *R) 
{ 
    if (R==NULL) 
    return; 
    InOrder(R->left); 
    InOrder(R->right); 
    printf("%d %s\n",R->code,R->subject); 
} 

struct NODE *Search(struct NODE *R,int CODE,struct NODE **father) 
{ 
    if(R==NULL) 
    return NULL; 
    if(R->code==CODE) 
    { 
     *father=R; 
     return R; 
    } 
    if (CODE<R->code) 
    return Search(R->left,CODE,father); 
    else 
    return Search(R->right,CODE,father); 
} 

struct NODE * CreateNode(struct NODE T) 
{ 
    struct NODE *tmp; 
    tmp=(struct NODE *)malloc(sizeof(T)); 
    *tmp=T; 
    tmp->left=tmp->right=NULL; 
    return tmp; 
} 

int Insert(struct NODE **R,struct NODE ND) 
{ 
    struct NODE *cur,*fath=NULL; 
    cur=Search(*R,ND.code,&fath); 
    if (cur) 
    return 0; 
    cur=CreateNode(ND); 
    if(fath==NULL) 
    *R=cur; 
    else 
    if(fath->code>ND.code) 
    fath->left=cur; 
    else 
    fath->right=cur; 
    return 1; 
} 

struct NODE *MinOfMax (struct NODE *ND) 
{ 
    struct NODE *tmp; 
    if (ND==NULL) 
    return NULL; 
    if(ND->right==NULL) 
    return NULL; 
    tmp=ND->right; 
    while(tmp->left!=NULL) 
    tmp=tmp->left; 
    return tmp; 
} 

struct NODE* Delete(struct NODE *R, int code) 
{ 
    if (R==NULL) 
    return R; 
    if (code<R->code) 
    R->left=Delete(R->left,code); 
    else if (code>R->code) 
    R->right=Delete(R->right,code); 
    else 
    { 
     if (R->left==NULL) 
     { 
      struct NODE *temp=R->right; 
      free(R); 
      return temp; 
     } 
     else if (R->right==NULL) 
     { 
      struct NODE *temp=R->left; 
      free(R); 
      return temp; 
     } 
     struct NODE *temp=MinOfMax(R->right); 
     R->code=temp->code; 
     R->right=Delete(R->right,temp->code); 
    } 
    return R; 
} 

iはバイナリツリーにノードを挿入しようとすると、プログラムcrashes.Hereは私の主である:

int main(int argc,char* argv[]) 
{ 
    typedef struct NODE NODE; 
    NODE *root=NULL; 
    NODE tmp; 
    Insert(&root,tmp); 
    return 0; 
} 

Iは=静的サンプルコードの値(= 100と対象を割り当てることを試みました"Physics")でも、プログラムはクラッシュします。私は何かをmallocする必要がありますか、ヘッダーファイル内の何かを変更するか、まったく違うことをしますか?何か解決策を見つけることなく何時間もここにこだわっています。整数をノードのデータとして返しますが、ノード全体を渡す必要があります。

+2

のメインルートは未初期化です。 (そしてそれはtmpです) – wildplasser

+0

プログラムの出力を追加してください、人々はより良​​い情報であなたを助けることができます:) – captainepoch

+0

@wildplasser私はそれを初期化する必要がありますか?私はルートノードをmallocする必要がありますか? –

答えて

1

あなたのコードは基本的に何もしません。それはどこかからコピー貼り付けられたようです。私はそれを理解しようとしたが、ここでコード例がある。基本的には、挿入しようとするとメインの新しいノードを初期化する必要があります。 これは単なる例であり、完全なテストではありませんでした。

int main(int argc,char* argv[]) 
{ 
    typedef struct NODE NODE; 
    NODE *root=NULL; 
    NODE *tmp = malloc(sizeof(struct NODE)); 
    tmp->code = 1; /*Just a number*/ 
    strcpy(tmp->subject,"prova"); /*Put something in it*/ 
    Insert(&root,*tmp); /* Try to insert it*/ 
    PreOrder(root); /*Try to see if it has been inserted*/ 
    return 0; 
} 
+0

答えをありがとう、私はNULLにルートポインタを初期化していない私のせいでした。今私のプログラムは正しく動作します。 –

+0

@ JohnM。あなたはその答えを正しい人としてマークするべきです。 – BetaRunner

1

tmpノードが新しく挿入されるノードは、main()で初期化されています。 -Wallフラグを使用していた場合は、あなたのコンパイラはこれを警告していた可能性があります。

それでは、あなたの挿入機能で見てみましょう:

int Insert(struct NODE **R, struct NODE ND) 
{ 
    struct NODE *cur,*fath=NULL; 
    cur = Search(*R, ND.code, &fath); // ND.code is junk, since ND is uninitialized 
    ... 
    return 1; 
} 

そうなセグメンテーションフォールトが発生しています。

rootでもNULLmain()に初期化することができます。


なく、あなたの問題の原因が、Do I cast the result of malloc?

+0

コンパイラは初期化されていない値の使用を診断しないことがよくあります(私はいつもValgrindのものを見つけました)。 –

+0

私は理解していますが、Insert関数の外で初期化する必要があります。 –

+0

@PaulStelian correct、私の更新された答えを見てください!はい、ジョン – gsamaras

関連する問題