我正在尝试计算每个节点的频率,因为我将它们添加到树中,而不是插入新元素。出于某种原因,当将新键与当前树中的每个元素进行比较时,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语句中运行代码,即使在调试之后也不知道是什么错误。
答案 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)) {