2016-12-01 5 views
1

Я пишу линейную и квадратичную программу хеш-таблицы зондирования.Перерыв if statement C++ error

Это для цикла, который я использовал для линейной функции зондирования, и он отлично работает.

//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; 
      } 

так что я написал цикл снова в квадратичной функции ощупывания для решения столкновения

//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 

I я действительно запутался, почему он вызывает ошибку во втором, пока он отлично работает в линейном зондировании. Может ли кто-нибудь объяснить, почему?

+3

Вам не хватает фигурных скобок после цикла for. – sebastian

ответ

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; 
    } 
} 

Эмпирическое правило - всегда ставить фигурные скобки при использовании цикла или если-заявление, потому что это поможет вам не делать таких ошибок, как это.

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; 
    } 
} 

Хорошее эмпирическое правило заключается в фигурные скобки вокруг любого тела цикла, который больше, чем одиночная линия длинный. Многие могли бы порекомендовать даже поместить фигурные скобки вокруг отдельных линий, если вы захотите добавить больше к телу цикла позже.

1

Поскольку только непосредственно следующее утверждение является для тела цикла, так

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; 
} 

Для вашего 1-го образца кода, все if утверждения является для тела цикла, поэтому он прекрасно работает.

Чтобы исправить код, вы можете использовать фигурные скобки, чтобы сделать его compound statement, который может состоять из нескольких операторов.

for(i=((hashVal % tableSize+1) % tableSize); i < tableSize; i++) { 
    j = i^2; 

    if(a[j] == -1){ 
     a[j] = hashVal; 
     break; 
    } 
}