我一直试图通过文件处理插入一个节点到我的树,但它总是只插入一个节点,然后程序将强制关闭自己。我曾试图把数据放在一个链接列表,它的工作。所以这里的问题可能不是file.txt本身,而是我的树。有人能告诉我,我做错了什么?
这是我的树算法
struct user {
char username[50];
int money;
char favorite[50];
user *left;
user *right;
};
user *root = NULL;
user *userTree(char username[], int money, char favorite[]) {
user *newBranch = (user *) malloc(sizeof(user));
strcpy(newBranch->favorite, favorite);
strcpy(newBranch->username, username);
newBranch->money = money;
return newBranch;
}
user *insertUser(user *root,char username[], int money, char favorite[]) {
if (root == NULL) {
return userTree(username ,money, favorite);
}
else if (strcmp(username, root->username) < 0) {
root->left = insertUser(root->left, username, money, favorite);
}
else {
root->right = insertUser(root->right, username, money, favorite);
}
return root;
}
这是我的文件处理算法
void insertCredential() {
FILE* fr = fopen("users/users.txt", "r");
while (!feof(fr)) {
char username[50], garbage[50], favorite[50];
int money;
fscanf(fr, "%[^#]#%[^#]#%d#%[^\n]\n", username, garbage, &money, favorite);
root = insertUser(root, username, money, favorite);
puts("test insert");
}
fclose(fr);
}
我试着把数据放在一个链接列表中,它工作了,但我想知道为什么我不能把它插入到一个树
1条答案
按热度按时间mwg9r5ms1#
至少这些问题:
1.代码在malloc()之后没有初始化左成员和右成员,导致未定义的行为。考虑
calloc()
. @trincotwhile (!feof(fr))
是错误的。@Andreas Wenzel。检查fscanf()
的返回值。"%[^#]#%[^#]#%d#%[^\n]\n"
缺少允许输入溢出的宽度。请添加宽度。"%49[^#]#%49[^#]#%d#%49[^\n]\n"
1.未检查
fopen()
的结果。1.未检查分配返回指针是否成功。
1.代码不是有效的C。似乎使用了C++编译器:@某个程序员
缺点:
money
作为int
可能太窄。请考虑long
和 width:"%d"
--〉"%9ld"
。1.在C语言的
newBranch = (user *) malloc(sizeof(user));
中不需要强制转换。当大小引用对象而不是类型时更容易维护:newBranch = malloc(sizeof newBranch[0]);
1.对于未更改的参考数据,使用
const
的适用性更强:userTree(char username[], int money, char favorite[])
--〉userTree(const char username[], int money, const char favorite[])
。1.尾随的
"\n"
可以读取多个空格。使用fgets()
读取1 line 的面向行的数据,然后进行解析,可以更好地进行错误检查。