2016-07-23 13 views
0

私はゆっくりとプログラムを書いていて、バイナリツリーを教えようとしています。このプログラムは、そのデータを格納するためにツリーを使用する電話帳です。私は現在、私のfindOrInsert関数に固執しています。もともと私はそれをオープンエリアに挿入するだけでした。今、私はそのデータを追加する前に既に存在するかどうかを確認したい。それでは、ユーザーにプロンプ​​トを出す機能から戻ってきたら、既に同じデータがあります。私はいくつかのことを試みましたが運はありません。私はちょうどゼロからそれを書き直すことを試みるかもしれない。その前に私は助けを得ることができるかどうかを見たいと思っていました。バイナリツリー:同じ値を見つける

これは私が現在持っているものです。

struct treeNode * findOrInsert(struct treeNode *p, Entry e) { 

    if (p == NULL) { 
     p = createNode(NULL, NULL, e); 
    } 
    else if (strcmp(e.fName, p->data.fName) < 0) { 
     p->left = findOrInsert(p->left, e); 
    } 
    else if (strcmp(e.fName, p->data.fName) > 0) { 
     p->right = findOrInsert(p->right, e); 
    } 
    else { 
     if (strcmp(e.lName, p->data.lName) < 0) { 
      p->left = findOrInsert(p->left, e); 
     } 
     else if (strcmp(e.lName, p->data.lName) > 0) { 
      p->right = findOrInsert(p->right, e); 
     } 
     else { 
      return p; 
     } 
    } 
    return p; 
} 

struct treeNode * createNode(struct treeNode *q, struct treeNode *r, Entry e) { 
    struct treeNode * newNode; 
    newNode = (struct treeNode*)(malloc(sizeof(struct treeNode))); 
    newNode->data = e; 
    newNode->left = q; 
    newNode->right = r; 
    return newNode; 
} 

何か助けてください!

答えて

0

なぜ単にpeの姓と名が等しいかどうかを確認するために

if (p == NULL) { 
    p = createNode(NULL, NULL, e); 
} 

後に別のチェックを追加しませんか? (もちろん、あなたのツリーの各エントリに名字があると仮定します)。この文の後に、ヌルオブジェクトをeと比較したくないので、私は言う。したがって、pが存在することを確認したら、eの名字がpのものと等しいかどうかを確認する必要があります。もしそうならば、eが既にツリーに存在するか何かを出力して、pを返して、再帰を終了します(何かを返す代わりに、例外をスローするのがプログラムの実行を止めるでしょう)。これは次のようになります。

else if (strcmp(e.fName, p->data.fName) == 0 && strcmp(e.lName, p->data.lName) == 0) { 
    printf("Entry already exists in tree"); 
    return p; 
} 
+1

私はそれを試みました。別の何かをしなければならなかった。今はうまくいくようです。ありがとうございました! – arthos455

関連する問題