2017-11-06 10 views
-4

BSTのCプログラムを作成する必要がありますが、ルートノードには左の子または右の子を作成できません。ルートノードの作成はOKです。ルートノードの要素を検索することもできます。しかし、ツリー内の複数の要素 、私はこの問題を解決するのに役立つ親切に私はCプログラミング:Cを使用してバイナリ検索ツリーを作成する際にエラーが発生しました

#include<stdio.h> 
#include<stdlib.h> 
typedef struct tree 
{ 
    struct tree *left; 
    int data; 
    struct tree *right; 
}node; 
node *ROOT; 
////////////////////////// 
void *bud() 
{ 
    return (node *)malloc(sizeof(node)); 
} 
///////////////////// 
void createNode(int data, node *ptr) 
{ 
    if(ptr==NULL) 
    { 
     ptr=bud(); 
     ptr->data=data;  
     ptr->left=NULL; 
     ptr->right=NULL; 
     ROOT=ptr; 
     ptr=NULL; 
     printf("DONE"); 
     return; 
    } 
    else if(data==ptr->data) 
    { 
     printf("Duplication not possible"); 
     return; 
    } 
    else if (data<ptr->data) 
    { 
     //ptr=ptr->left; 
     createNode(data,ptr->left); 
    } 
    else if (data>ptr->data) 
    { 
     //ptr=ptr->right; 
     createNode(data,ptr->right); 
    } 
    else 
    { 
     printf("INVALID"); 
    } 
} 
////////////////////////////////////// 
void search(int data,node *ptr) 
{ 
    if(ptr==NULL) 
    { 
     printf("NOT FOUND"); 
     return; 
    } 
    else if (ptr->data==data) 
    { 
     printf("Item Found"); 
     return; 
    } 
    else if(data<ptr->data) 
    { 
     //ptr=ptr->left; 
     search(data,ptr->left); 
    } 
    else if (data>ptr->data) 
    { 
     //ptr=ptr->right; 
     search(data,ptr->right); 
    } 
    else 
    { 
     printf("INVALID"); 
    } 
} 
///////////////////////////////// 
void main() 
{ 
    int ch; 
    ch=0; 
    while (ch!=6) 
    { 
     printf("\nMENU\n1. Create Tree\n2. Search\n3. Inorder\n4. 
Preorder\n5. Postorder\n6. Exit\n EnterYour Choice: "); 
     scanf("%d",&ch); 
     if(ch==1) 
     { 
      int dat; 
      printf("\nEnter the number to be inserted: "); 
      scanf("%d",&dat); 
      createNode(dat,ROOT); 
     } 
     else if(ch==2) 
     { 
      int dat; 
      printf("Enter number to be searched: "); 
      scanf("%d",&dat); 
      search(dat,ROOT); 
     } 
     else if(ch==6) 
     { 
      return; 
     } 
     else 
     { 
      printf("\nEnter a valid choice\n"); 
     } 
    } 
}  

問題は論理エラーですが作られた間違いについて教えてくださいを追加することはできません。私はツリーの左または右の子を作成することはできません。ツリーに挿入するものがルートノードに挿入されます。

+1

コード(リンクではない)とエラーが表示されます – Steve

+1

質問の中にソースを含める必要があります。良い質問をする方法について[質問]と[質問]を参照して、回答を得るチャンスを最大化してください。 –

+1

コード、エラー、サンプルデータ、またはテキスト出力を、外部リンクとしてではなくプレーンテキストとして投稿してください。期限切れになるか、問題とは無関係に更新される可能性があります。 '{}'ボタンを使ってコードのブロックを整形するか、同じ効果のために4つのスペースをインデントします。 – tadman

答えて

0

エラーはcreateNode()機能にあります:node *ptrを渡し、ptr=bud();のように割り当てます。しかしこれは、親ノード内のポインタではなく、ローカル変数を変更するだけです。 node **ptrを渡して、関数*ptr=bud();の内部で参照解除を行ってください。 &演算子を使用してポインタへのポインタを取得します。 @H.S。上記のROOT=ptr;ステートメントは、プログラムがノードを失う原因になります。あなたがメモリを割り当てて、それを解放しないことに加えて(あなたがROOTノードへのポインタを失うので、それをすることさえできません)。

+0

、または新しいノードにポインタを戻す – pm100

1

ツリーの左または右の子を作成できません。ツリーに挿入するものがルートノードに挿入されます。

これが原因であなたのcreateNode()でこの文の起こっている:

ROOT=ptr; 

ツリーで要素を挿入するたび、あなたは再帰的にツリーをトラバースしたときに挿入するための適切な場所を見つけている、あなたはNULL(ptr-> leftまたはptr-> rightのいずれか)のcreateNode()に渡しており、ROOTptrに再割り当てされています。

私はちょうどそれが正しく、createNode()は次のようになります仕事をするためにあなたのプログラムに変更を加える場合:

void createNode(int data, node **ptr) 
{ 
    if(*ptr==NULL) 
    { 
     *ptr=bud(); 
     (*ptr)->data=data; 
     (*ptr)->left=NULL; 
     (*ptr)->right=NULL; 
     printf("DONE"); 
     return; 
    } 
    else if(data==(*ptr)->data) 
    { 
     printf("Duplication not possible"); 
     return; 
    } 
    else if (data<(*ptr)->data) 
    { 
     createNode(data,&((*ptr)->left)); 
    } 
    else if (data>(*ptr)->data) 
    { 
     createNode(data,&((*ptr)->right)); 
    } 
    else 
    { 
     printf("INVALID"); 
    } 
} 

そしてmain()で、あなたがする必要があります。

createNode(dat,&ROOT); 

しかし、プログラムの改善範囲があります。たとえば、ご使用のプログラムでノードcreationinsertionを分離してください。私はあなたに改善とそれらの実装のより良い方法を見つけるためにそれを残しています。

関連する問題