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