在开放地址哈希表中'空出'只能存储一个变量吗?

时间:2013-05-21 03:01:18

标签: c hashtable

我正在研究使用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;

 }

}

1 个答案:

答案 0 :(得分:0)

列表中的几个元素都可以指向同一个vacated成员 - 所以不,你不能在表中只有一个腾出的插槽。您还可以连续几个空位。链接将指向下一个条目;数据指针将指向vacated,因此您知道曾经有一个元素在这里,您应该继续搜索它。