遍历树时返回错误

时间:2014-11-23 16:28:27

标签: c if-statement return codeblocks avl-tree

我正在尝试计算每个节点的频率,因为我将它们添加到树中,而不是插入新元素。出于某种原因,当将新键与当前树中的每个元素进行比较时,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

输出(在preOrder中打印后):

key: wrn69, frequency: 1
key: flr830, frequency: 3
key: flr662, frequency: 1
key: flr231, frequency: 1
key: flr830, frequency: 1
key: flr830, frequency: 1

我想要打印所有显示的内容,但我不希望将相同的密钥插入树中,只需将其频率增加1即可。

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

1 个答案:

答案 0 :(得分:1)

我不确定您的代码尝试做什么,因为您没有定义node结构,但是您的函数int sameFrequency(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 execute left to right中的&&语句更有意义:

        if(root!=NULL && (sameFrequency(root, key)==1)) { 
相关问题