C语言 我似乎不能在树中插入节点,有人能看一下我的代码,告诉我哪里做错了吗?

7gyucuyw  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(135)

我一直试图通过文件处理插入一个节点到我的树,但它总是只插入一个节点,然后程序将强制关闭自己。我曾试图把数据放在一个链接列表,它的工作。所以这里的问题可能不是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);
}

我试着把数据放在一个链接列表中,它工作了,但我想知道为什么我不能把它插入到一个树

mwg9r5ms

mwg9r5ms1#

至少这些问题:
1.代码在malloc()之后没有初始化左成员和右成员,导致未定义的行为。考虑calloc(). @trincot

  1. while (!feof(fr))是错误的。@Andreas Wenzel。检查fscanf()的返回值。
  2. "%[^#]#%[^#]#%d#%[^\n]\n"缺少允许输入溢出的宽度。请添加宽度。"%49[^#]#%49[^#]#%d#%49[^\n]\n"
    1.未检查fopen()的结果。
    1.未检查分配返回指针是否成功。
    1.代码不是有效的C。似乎使用了C++编译器:@某个程序员
    缺点:
  3. money作为int可能太窄。请考虑longwidth"%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 的面向行的数据,然后进行解析,可以更好地进行错误检查。

相关问题