내 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()를 사용해 보았지만 사용법을 잘 모르겠다. 도움을 주시면 감사하겠습니다.
'root = insertNode (root, buf, (비교) CmpStr);'모든 노드가 같은 버퍼를 가리 킵니다. (newNode-> name = name; in createnode()) main에있는 buf. newnode()에서 strdup 또는 simalar를 수행해야합니다. – wildplasser
이것이 문제가되는지는 잘 모르겠지만 'strcmp'는 1 또는 0 또는 -1을 반환하지 않습니다. "0보다 작음", 0 또는 "0보다 큼"을 반환합니다. (대부분의 구현은 해당 문자 값을 뺀 것에 의존하므로 'f'- 'a' '와'a '-'a '및'a '-'f '...를 생각해보십시오) –
@wildplasser 아마 그럴거야. –