Форум программистов, компьютерный форум CyberForum.ru

Не могу найти ошибку. Хеш-таблицы - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Что делает operator++ http://www.cyberforum.ru/cpp-beginners/thread1346796.html
Что делает operator++? Где и как он используется?
C++ В чем здесь ошибка? Взял пример из книги 3d game programming with DirectX11, немного переделал, т.к. #include <xnamath.h> больше не существует: #include <Windows.h> #include <DirectXMath.h> #include <iostream> using namespace std; using namespace DirectX; ostream& operator<<(ostream& os, FXMVECTOR v) http://www.cyberforum.ru/cpp-beginners/thread1346794.html
Игра «Угадай число» C++
4. Игра «Угадай число». Компьютер загадывает число, человек отгадывает. Всего 5 попыток. (random)
C++ Проверить, является ли число простым
3. Проверить, является ли число простым. Ввести с клавиатуры
C++ Найти максимум из введенных последовательных чисел http://www.cyberforum.ru/cpp-beginners/thread1346777.html
2. Найти максимум из введенных последовательных чисел. Завершить числом 0
C++ Вычислить среднее арифметическое последовательности чисел, которые вводятся с клавиатуры 1. Вычислить среднее арифметическое последовательность чисел, которые вводятся с клавиатуры. Завершить ввод числом 0 подробнее

Показать сообщение отдельно
Гром
205 / 124 / 11
Регистрация: 20.03.2009
Сообщений: 1,090
Записей в блоге: 16
Завершенные тесты: 1
05.01.2015, 12:01     Не могу найти ошибку. Хеш-таблицы
Вероятно, здесь у вас ошибка:
C++
1
2
3
4
5
6
7
8
9
                for (int i = key - 1; i > -1; i--)
                {
                    if (fl[i] == свободно)
                    {
                        a[i] = data;
                        flag = true;
                        fl[i] = занято;
                    }
                }
Даже если вы в одну ячейку поместили элемент, то несмотря на установку флага, вы все еще продолжаете забивать ячейки этим же элементом, поскольку флаг не проверяете.

Если выделить вставку в отдельную функцию (возвращаемое значение - успешна ли вставка), то можно обойтись без флага. Кроме того, проверку позиции key можно безболезненно совместить с проверкой последующих. Плюс я несколько изменил порядок обхода - закольцевал его (дойдя до конца, начинаем с нулевого элемента)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bool insert(int data, int* htable, int* isEmpty, int n)
{
int key = h(data);
for (unsigned i = key; i < n; ++i)
 if (isEmpty[i])
  {
  htable[i] = data;
  isEmpty[i] = false;
  return true;
  }
for (unsigned i = 0; i < key; ++i)
 if (isEmpty[i])
  {
  htable[i] = data;
  isEmpty[i] = false;
  return true;
  }
return false;
}
Еще в этой строке: if (!flag && flag == false) оба условия эквивалентны. Ну и несколько сомнительно определять макроопределения типа свободно/занято, когда можно переименовать массив и писать просто:
C++
1
2
if (isEmpty[i])
 isEmpty[i] = false;
 
Текущее время: 07:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru