Вероятно, здесь у вас ошибка:
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; |
|