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

C 是';空出';在开放地址哈希表中只能存储一个变量?,c,hashtable,C,Hashtable,我正在用C学习主算法,在开放地址哈希表程序中,作者定义:void*vacked指向哈希表中的空位置。如果我想连续删除哈希表中的2个值。这是真的吗?因为空出的将指向最后一个删除的变量,这是不可能的吗 如果我想连续删除两个具有相同哈希值的变量。我认为这与删除两个散列值不同的变量是不同的 在函数ohtbl\u remove中,我找不到将要删除的变量设置为NULL的语句。如果我想连续删除变量,它是如何删除变量的?谢谢 int ohtbl_remove(OHTbl *htbl, void **data)

我正在用C学习主算法,在开放地址哈希表程序中,作者定义:
void*vacked
指向哈希表中的空位置。如果我想连续删除哈希表中的2个值。这是真的吗?因为
空出的
将指向最后一个删除的变量,这是不可能的吗

如果我想连续删除两个具有相同哈希值的变量。我认为这与删除两个散列值不同的变量是不同的

在函数
ohtbl\u 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;

 }

}
int ohtbl\u删除(ohtbl*htbl,无效**数据){
int位置,
我
/*****************************************************************************
*                                                                            *
*使用双哈希对密钥进行哈希*
*                                                                            *
*****************************************************************************/
对于(i=0;ipositions;i++){
位置=(htbl->h1(*数据)+(i*htbl->h2(*数据)))%htbl->位置;
if(htbl->table[position]==NULL){
/***********************************************************************
*                                                                      *
*返回未找到数据的消息*
*                                                                      *
***********************************************************************/
返回-1;
}
else if(htbl->表[位置]==htbl->已空){
/***********************************************************************
*                                                                      *
*搜索空出的位置以外的位置*
*                                                                      *
***********************************************************************/
继续;
}
else if(htbl->match(htbl->table[位置],*数据)){
/***********************************************************************
*                                                                      *
*从表中传回数据*
*                                                                      *
***********************************************************************/
*数据=htbl->表格[位置];
htbl->表【位置】=htbl->空出;
htbl->尺寸--;
返回0;
}
}

列表中的多个元素可能都指向同一个
已空出的
成员-因此,表中不能只有一个空出的插槽。也可以有多个连续的空出插槽。链接将指向下一个条目;数据指针将指向
已空出的
,因此您知道这一点有一次,这里有一个元素,你应该继续搜索它。

是的,这是我在实现我的元素时犯的第一个错误,如果你看看谷歌是如何做到的,我想我记得,如果他们注意到“删除”标志污染超过50%,他们会调用垃圾压缩功能。