2017-03-05 2 views
0

내 BST에 삽입하려고하는데 루프를 만드는 데 어려움을 겪고 있습니다. 하나씩 삽입 할 때 코드가 작동하지만 루프에 삽입하려고하면 올바르게 삽입되지 않습니다.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 또는 "0보다 큼"을 반환합니다. (대부분의 구현은 해당 문자 값을 뺀 것에 의존하므로 'f'- 'a' '와'a '-'a '및'a '-'f '...를 생각해보십시오) –

+0

@wildplasser 아마 그럴거야. –

답변

0

루프에서 항상 동일한 버퍼를 삽입 함수에 전달합니다. createNode은 버퍼 내용을 복사하지 않고 (항상) 동일한 버퍼에 대한 참조를 저장합니다. 따라서 삽입 후 버퍼 내용을 변경하면 이전에 삽입 된 노드의 "내용"도 변경됩니다.

newNode->name = namenewNode->name = strdup(name)으로 바꾸시겠습니까? 이것은 실제로 전달 된 "내용"을 복사하고 보관할 메모리에 대한 BST 제어를 제공합니다. 따라서 나중에 노드를 삭제할 때이 메모리를 비우는 것을 잊지 마십시오.