我正在研究使用C的主算法,并且在开放地址哈希表程序中,作者定义:void *vacated;
指向哈希表中的空出位置。所以,如果我想连续删除哈希表中的2个值。这是真的,因为vacated
将指向最后删除的变量,这是不可能的吗?
如果我想连续删除相同哈希值的两个变量。我认为这与删除不同哈希值的两个变量不同。
在函数ohtbl_remove
中,我找不到要删除的变量的NULL语句。如果我想连续删除变量,它如何设法删除变量?感谢。
int ohtbl_remove(OHTbl *htbl, void **data) {
int position,
i;
/*****************************************************************************
* *
* Use double hashing to hash the key. *
* *
*****************************************************************************/
for (i = 0; i < htbl->positions; i++) {
position = (htbl->h1(*data) + (i * htbl->h2(*data))) % htbl->positions;
if (htbl->table[position] == NULL) {
/***********************************************************************
* *
* Return that the data was not found. *
* *
***********************************************************************/
return -1;
}
else if (htbl->table[position] == htbl->vacated) {
/***********************************************************************
* *
* Search beyond vacated positions. *
* *
***********************************************************************/
continue;
}
else if (htbl->match(htbl->table[position], *data)) {
/***********************************************************************
* *
* Pass back the data from the table. *
* *
***********************************************************************/
*data = htbl->table[position];
htbl->table[position] = htbl->vacated;
htbl->size--;
return 0;
}
}
答案 0 :(得分:0)
列表中的几个元素都可以指向同一个vacated
成员 - 所以不,你不能在表中只有一个腾出的插槽。您还可以连续几个空位。链接将指向下一个条目;数据指针将指向vacated
,因此您知道曾经有一个元素在这里,您应该继续搜索它。