0

我正在用 C 和在开放地址哈希表程序中研究 Master Algorithms,作者定义: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;

 }

}
4

1 回答 1

0

列表中的多个元素可能都指向同一个vacated成员——所以不,表中只能有一个空位是不正确的。您还可以有几个连续的空位。链接将指向下一个条目;数据指针将指向,vacated因此您知道曾几何时这里有一个元素,您应该继续搜索它。

于 2013-05-21T03:14:39.427 回答