Кажется, не может разорвать цикл while при столкновении, хэшировании - PullRequest
0 голосов
/ 11 мая 2011

Я не знаю, почему этот код не выходит из цикла while:

int table_size = 953;
store hash_table[953];
for(int i = 0; i < table_size; i++)
    hash_table[i].count = 0;

//bunch of stuff to get hash value here

while(hash_table[hashNum].data != pString || hash_table[hashNum].count != 0){
    hashNum++;
    if(hashNum > table_size)
        hashNum = 0;
    cout << hash_table[hashNum].count; 
    // to check the value of the count in the array, it IS 0, thus should have broken the loop
}

Ответы [ 4 ]

1 голос
/ 11 мая 2011

Вы должны взглянуть на двоичную логику, особенно Теорема де Моргана

!(a && b) is equivalent to (!a) || (!b)
1 голос
/ 11 мая 2011

hash_table[hashNum].count, равное нулю, недостаточно для завершения цикла, так как вы используете || (" или ") между двумя условиями в тесте завершения. Если hash_table[hashNum].data не равно pString, цикл будет продолжаться независимо от значения hash_table[hashNum].count.

1 голос
/ 11 мая 2011

Я думаю, что ваше условие цикла должно быть hashNum != 0 вместо hash_table[hashNum].count != 0.

Во-вторых, в вашем состоянии while должно быть && вместо ||.

Это дикие предположения, так как в этом вопросе отсутствует много информации.

1 голос
/ 11 мая 2011

Вы, вероятно, имеете в виду:

while(hash_table[hashNum].data != pString && hash_table[hashNum].count != 0)

В вашем коде цикл будет продолжаться, если в любом случае задано значение true, hash_table[hashNum].count == 0 НЕ достаточно для того, чтобы сделать предложение ложным.

...