我正在编写线性和二次探测哈希表程序。
这是一个用于线性探测功能的for-loop,它工作得很好。
//when there's a collision increase i by 1 until finding empty slot
for(i = (hashVal % tableSize+1) % tableSize; i <tableSize; i++)
if(a[i] == -1){
a[i] = hashVal;
break;
}
所以我在二次探测函数中再次写了一个for循环来处理碰撞
//when there's a collision increase i by i^2
j = 0;
for(i=((hashVal % tableSize+1) % tableSize); i < tableSize; i++)
j = i^2;
if(a[j] == -1){
a[j] = hashVal;
break;
}
但是当我编译二次探测时,我得到了这个错误
error: 'break' statement not in loop or switch statement
我真的很困惑,为什么它导致第二个错误,而线性探测是好的。谁有人解释为什么?
答案 0 :(得分:5)
for(i=((hashVal % tableSize+1) % tableSize); i < tableSize; i++)
j = i^2;
这是你的周期,因为你并没有在它周围放上花括号。
修复很简单,把那些括号:
for(i=((hashVal % tableSize+1) % tableSize); i < tableSize; i++)
{
j = i^2;
if(a[j] == -1){
a[j] = hashVal;
break;
}
}
经验法则 - 在使用cycle或if-statement时总是使用花括号,因为它可以帮助你不做出这样的错误。
答案 1 :(得分:1)
因为只有紧随其后的语句才是for循环体,所以
for(i=((hashVal % tableSize+1) % tableSize); i < tableSize; i++)
j = i^2; // the body of for loop
// not for loop body from here (note the correct indent position)
if(a[j] == -1){
a[j] = hashVal;
break;
}
对于您的第一个代码示例,整个if
语句是for循环体,因此它可以正常工作。
要修复代码,您可以使用大括号将其设为compound statement,这可能包含多个语句。
for(i=((hashVal % tableSize+1) % tableSize); i < tableSize; i++) {
j = i^2;
if(a[j] == -1){
a[j] = hashVal;
break;
}
}
答案 2 :(得分:0)
你没有在for
声明的正文中加上大括号。这适用于第一个示例,因为正文只是if
语句,但在第二个示例中,只有j = i^2;
被解析为for
的一部分。代码相当于:
//when there's a collision increase i by i^2
j = 0;
for(i=((hashVal % tableSize+1) % tableSize); i < tableSize; i++) {
j = i^2;
}
if(a[j] == -1){
a[j] = hashVal;
break;
}
您可以通过在正确的位置添加大括号来解决此问题:
//when there's a collision increase i by i^2
j = 0;
for(i=((hashVal % tableSize+1) % tableSize); i < tableSize; i++) {
j = i^2;
if(a[j] == -1){
a[j] = hashVal;
break;
}
}
一个好的经验法则是在任何多于一行的循环体周围放置大括号。许多人甚至建议在单行周围放置大括号,以防你想在以后向循环体添加更多。