2017-03-05 6 views
0

私は自分のBSTに挿入しようとしていますが、私はそこからループを作成するのに苦労しています。 コードは1つずつ挿入すると機能しますが、ループに挿入しようとすると正しく挿入されません。ノードをCのループ上のBSTに挿入

#include <stdio.h> 
#include <stdlib.h> 
#include <assert.h> 
#include <string.h> // for strcmp() 
#include <ctype.h> // for toupper() 

typedef struct BstNode{ 
    //char name[20]; 
    // int data; 
    struct BstNode* left; 
    struct BstNode* right; 
    char* name; 
}BstNode; 

typedef int (*Compare)(const char*, const char*); // makes comparisons easier 

/* Returns pointer address to newly created node */ 
BstNode* createNode(char* name){ 
    BstNode* newNode = (BstNode*)malloc(sizeof(BstNode)); // Allocates memory for the newNode 
    newNode->name = name; // newNode->data is like newNode.data 
    newNode->left= NULL; 
    newNode->right = NULL; 
    return newNode; 
} 

//insert node into Tree recursively 
BstNode* insertNode(BstNode* node, char* name, Compare cmp){ 
    int i; 
    /* char *s1 = node->name; 
    char *s2 = name; 
    printf("s1: %s, s2: %s\n", s1,s2); 
    i = strcmp(s1, s2); // if =1, s1 is greater 
    printf("i: %d\n", i); */ 

    if(node == NULL){// if tree is empty 
    // printf("inside NULL\n"); 
    node = createNode(name); 
    //return node; 
    } 
    else{ 
    i = cmp (name, node->name); // sweet 
    if(i == -1){ 
     // printf("inside left\n"); 
     node->left = insertNode(node->left, name, cmp); 
     //return node; 
    } 
    else if(i == 1){ 
     // printf("inside right\n"); 
     node->right = insertNode(node->right, name, cmp); 
     //return node; 
    } 
    else if(i == 0){ //avoid duplicates for now 
     // printf("inside 0\n"); 
     printf("Name is in BST\n"); 
     return NULL; 
    } 
    } 
    return node; 
} 

BstNode* printTree(BstNode* node){ 
    if(node == NULL){ 
    return NULL; 
    } 
    printTree(node->left); 
    printf("%s\n",node->name); 
    printTree(node->right); 
} 

int CmpStr(const char* a, const char* b){ 
    return (strcmp (a, b));  // string comparison instead of pointer comparison 
} 
//void Insert(Person *root, char name[20]); 

int main(){ 
    BstNode* root = NULL; // pointer to the root of the tree 
    char buf[100]; 
    char option = 'a'; 

    while(1) { 
    printf("Enter employee name"); 
    scanf("%s",buf); 
    printf ("Inserting %s\n", buf); 
    root = insertNode(root, buf, (Compare)CmpStr); 
    printTree(root); 
    } 
} 

私はコードでルート= insertNode(ルート、名前、(比較)CmpStrに) 複数回行うことができますが、私は、ユーザー入力にループにそれをしようとした場合、それは正しく挿入されません。 scanf()やルートが正しく設定されていないという事実と関係があるかどうかは分かりません。私もfgets()を使ってみましたが、どうやってそれを使いこなし続けるのかはあまりよく分かりません。 何か助けていただければ幸いです。

+1

'root = insertNode(root、buf、(比較)CmpStr);'すべてのノードが同じバッファを指しています。 ( 'newNode-> name = name;' in createnode())mainのbufです。 newnode()でstrdupまたはsimalarを実行する必要があります – wildplasser

+0

これが問題かどうかわかりませんが、 'strcmp'は1または0または-1を返しません。 「0より小さい」、0、または「より大きい」を返します。 (ほとんどの実装では、対応する文字の値を減算することに頼っているので、 '' f ' - ' a ''と 'a' - 'a'と 'a' - 'f' ...を考えてください) –

+0

@wildplasserそれはおそらくそれです。 –

答えて

0

ループでは、常に同じバッファを挿入関数に渡します。 createNodeは、バッファの内容をコピーするのではなく、(常に)同じバッファへの参照を格納します。したがって、挿入後にバッファ内容を変更すると、以前に挿入されたノードの「内容」も変更されます。

newNode->name = namenewNode->name = strdup(name)に置き換えることをお勧めします。これにより、渡された "内容"が実際にコピーされ、保持されるメモリをBST制御できます。そのため、後でノードを削除するときにこのメモリを解放することを忘れないでください。

関連する問題