2017-01-16 9 views
-1

バイナリ検索ツリーに整数値を挿入するプログラムを作成しました。それはうまくいくようですが、整数の代わりに文字配列を受け入れるように変更すると、予期しない結果が得られます。C++での文字列のバイナリ検索ツリー

struct Node{ 
char data[50]; 
struct Node* right; 
struct Node* left; 
}; 

typedef struct Node* NODE; 

NODE createNode(char data[]){ 
    NODE newNode = (NODE) malloc (sizeof(struct Node)); 

if(!newNode){ 
    cout<<"Not enough memory"<<endl; 
    exit(-1); 
} 
newNode->left = NULL; 
newNode->right = NULL; 
strcpy(newNode->data,data); 
return (newNode); 
} 

void insertNode(NODE* head,char data[]){ 

    NODE newNode = createNode(data); 
    NODE hold_the_head = *head; 
    if(*head == NULL){ 
     *head = newNode; 
     (*head)->right = NULL; 
     (*head)->left = NULL; 
     return; 
    } 

    while(1){ 
     if((newNode->data>(*head)->data)&&((*head)->right==  NULL)){ 
      (*head)->right = newNode; 
      *head = hold_the_head; 
      return; 
     } 
     else if(newNode->data > (*head)->data){ 
      (*head) = (*head)->right; 
     } 

     else if((newNode->data < (*head)->data) && ((*head)->left == NULL)){ 
      (*head)->left = newNode; 
      *head = hold_the_head; 
      return; 
     } 
     else if(newNode->data < (*head)->data){ 
      (*head) = (*head)->left; 
     } 
    } 
} 

void inOrderTraversal(NODE node){ 

    if(node == NULL) 
     return; 
    inOrderTraversal(node->left); 
    cout<<node->data<<"\t"; 
    inOrderTraversal(node->right); 
} 

int main(){ 

    NODE head = NULL; 
    insertNode(&head,"karan"); 
    insertNode(&head,"sameer"); 
    insertNode(&head,"palak"); 
    insertNode(&head,"jagdish"); 
    insertNode(&head,"naman"); 
    insertNode(&head,"umang"); 
    insertNode(&head,"chandu"); 

    inOrderTraversal(head); 
    cout<<endl; 
    return 0; 
} 

出力:

カランサミールpalakジャグデイシュナマンumang chandu

予想:

chanduジャグデイシュカランナマンpalakサミールumang は、ここに私の完全なコードです

これまでに質問されているようですが、コンパイルエラーがありました。私のコードは何のエラーも投げていませんが、いくつかの論理的な欠陥があるようです!

答えて

2

rachitmanitの回答に加えて、C++ではなく、Cで書いているように感じました。

char data[50]; 

あなたがC++で書いている場合は、std::stringを使うことをお勧めします。 (すなわち、コンストラクタを呼び出すことはありません)など

NODE newNode = (NODE) malloc (sizeof(struct Node)); 

旧Cのmalloc専用メモリを割り当て、オブジェクトを作成しない、==<と便利比較することができます。それがなければならない:NODE newNode = new Node;

(*head)->right = NULL; 
(*head)->left = NULL; 
/*etc...*/ 

NULLは整数ではなく、ポインタであり、通常0です。私は間違いなくnullptrを使用することをお勧めします。

void insertNode(NODE* head,char data[]){ 

通常、ポインタ引数はnullptrである可能性があります。 void insertNode(NODE &head, std::string data){

cout<<endl; 

std::cout<<std::endlであるべき:私はあなたにはありません参照し、使用することをお勧めします。

また、メモリの割り当てを解除することを忘れないでください。プログラムはメモリを割り当て、割り当てを解除しないので、メモリリークが発生します。 struct Nodeは、破壊されたときにメモリの割り当てを解除する必要があります。

struct Node { 
    std::string data; 
    Node *right; 
    Node *left; 
    ~Node() { 
     delete right; 
     delete left; 
    } 
}; 
/* ... */ 
int main() { 
    /* ... */ 
    delete head; 
    return 0; 
} 
+0

Thanxたくさんです!!実際には文字配列の代わりに文字列を使ってみました。しかし、セグメンテーション違反があり、解決できなかったので、文字配列を使用することに決めました! –

+0

また、 'malloc'はコンストラクタを呼び出さないので、メンバ' std :: string'のコンストラクタを呼び出さない。おそらくそれがセグメンテーション違反を持っている理由です。 –

+0

それは私が知りませんでした! 多くのことがあります! –

1

整数の場合、「データ」は実際には値です。ここで、「node-> data」はdata []配列の最初のブロックのアドレスです。 node-> data [0]は値であることを覚えておいてください。実際の「価値」ではなくここで住所を比較しています。これは役立つはずHow to compare string in an character array?

はまた、あなたはこれに従わなければなりません。

+0

ありがとうございました.... –