2017-03-05 47 views
0

我试图插入到我的BST,但我努力创建一个循环。 当我逐一插入代码时,该代码有效,但当我尝试将其放入循环中时,它无法正确插入。在CST的循环中插入节点B

#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()或root没有正确设置的事实有关。我也尝试过使用fgets(),但我不太清楚如何使用它并不断弄乱它。 任何帮助表示赞赏。

+1

'root = insertNode(root,buf,(Compare)CmpStr);'你所有的节点指向同一个缓冲区。 ('newNode-> name = name;'在createnode()中)buf在main中。您应该在newnode() – wildplasser

+0

中执行strdup或simalar我不知道这是否是您的问题,但是'strcmp'不会返回1或0或-1。它返回“小于零”,0或“大于零”。 (大多数实现依赖于减去相应的字符值,所以想想''f' - 'a''和'a' - 'a'和'a' - 'f'...) –

+0

@wildplasser好的!这可能是。 –

回答

0

在循环中,您始终将相同的缓冲区传递给插入函数;您的createNode不会复制缓冲区的内容,而是存储对(总是)相同缓冲区的引用;因此,插入后更改缓冲区内容也会更改以前插入的节点的“内容”。

我建议用代替newNode->name = namenewNode->name = strdup(name)。这实际上会复制传递的“内容”,并让您的BST控制保留内存。因此,稍后在删除节点时不要忘记释放此内存。