C 遍历树时返回错误

C 遍历树时返回错误,c,if-statement,return,codeblocks,avl-tree,C,If Statement,Return,Codeblocks,Avl Tree,我试图在将每个节点添加到树中时计算它们的频率,而不是插入新元素。由于某些原因,当将新键与当前树中的每个元素进行比较时,如果它们都相同,if语句将不会返回1。但是,该函数仍会将现有节点的频率增加1。这让我非常困惑,因为我不知道为什么它会跳过返回1,继续在树中搜索。提前感谢您的帮助/建议 结构: typedef struct node { char* key; struct node *left; struct node *right; int height;

我试图在将每个节点添加到树中时计算它们的频率,而不是插入新元素。由于某些原因,当将新键与当前树中的每个元素进行比较时,如果它们都相同,if语句将不会返回1。但是,该函数仍会将现有节点的频率增加1。这让我非常困惑,因为我不知道为什么它会跳过返回1,继续在树中搜索。提前感谢您的帮助/建议

结构:

typedef struct node {
    char* key;
    struct node *left;
    struct node *right;
    int height;
    int frequency;
}node;
这是我的解析函数:

while(fgets(str, 100, textFile)) {

    token = strtok(str," \n");

    while (token != NULL)
    {
        key = strdup(token);
            if((sameFrequency(root, key)==1)&&root!=NULL) { 
                printf("%s", key);
                free(key);
                token = strtok (NULL, " \n");
            }
            else {
                root = insert(root, key);
                //printf("%s\n", key);
                free(key);
                token = strtok (NULL, " \n");
            }
    }
    if(ferror(textFile))
    {
        printf("you done messed up a-a-ron");
        return(0);
    }
}
用于检查每个节点的频率的功能:

int sameFrequency(node *node, char* key) {
    if (node != NULL) {

        if(strcmp(key, node->key)==0){ //This statement is true in some cases, but will not return the 1
            node->frequency = node->frequency+1;
            printf("%d\n",node->frequency);
            return 1;
        }

        sameFrequency(node->left, key);
        sameFrequency(node->right, key);
    }
    else return 0;
}
输入将如下所示:

wrn69 flr830 flr662 flr830 flr830 
flr231
输出(按预定顺序打印后):

我希望它打印显示的所有内容,但我不希望将同一个键插入到树中,只需将其频率增加1


TL;DR:函数跳过返回值,但仍在if语句中运行代码,即使在调试之后,也不知道有什么问题。

我不确定您的代码试图做什么,因为您没有定义
节点
结构,但是您的函数
int samefresquence(node*node,char*key)
有一个明显的错误:并非所有代码路径都返回值。为了清晰起见,您可以看到如果
strcmp(key,key)=0
则返回未定义:

int sameFrequency(node *node, char* key) {
    if (node != NULL) {

        if(strcmp(key, node->key)==0){
            node->frequency = node->frequency+1;
            printf("%d\n",node->frequency);
            return 1;
        }
        else { 
            sameFrequency(node->left, key);
            sameFrequency(node->right, key);
            // Continue on out of the "if" statements without returning anything.
        }
    }
    else {
        return 0;
    }
    // NO RETURN STATEMENT HERE
}
我的编译器为此生成警告:

警告C4715:“sameFrequency”:并非所有控制路径都返回值

当然,你也必须这样做,除非你故意使他们残疾。这样的警告很重要,在完成代码之前应该清除这些警告

我猜你可能想做这样的事

int sameFrequency(node *node, char* key) {
    if (node != NULL) {

        if(strcmp(key, node->key)==0){
            node->frequency = node->frequency+1;
            printf("%d\n",node->frequency);
            return 1;
        }
        else { 
            int found;
            if ((found = sameFrequency(node->left, key)) != 0)
                return found;
            if ((found = sameFrequency(node->right, key)) != 0)
                return found;
            return 0;
        }
    }
    else {
        return 0;
    }
}
这将清除编译器警告

顺便说一句,以下
if
语句可能顺序错误:

        if((sameFrequency(root, key)==1)&&root!=NULL) { 
由于C中的
&&
语句,以下内容更有意义:

        if(root!=NULL && (sameFrequency(root, key)==1)) { 

人们是否希望提供更多的信息,这是一个糟糕的问题,还是肉眼难以调试?如果需要,我可以提供更多信息。谢谢你的帮助!我现在要测试一下。我正在使用代码块,没有收到这样的错误。我用flags-WALL和-g编译,还有什么我应该使用的吗?附言,包括struct@BestBenchBudd-也许可以试试这里的说明:哇,好吧,我明白我做错了什么。非常感谢您的支持,它现在工作正常。现在只需要找出如何平衡AVL树!
        if(root!=NULL && (sameFrequency(root, key)==1)) {