本当はむずかしいハッシュテーブル

某所より自己転載。数え方にもよりますが、レベル1からレベル3まで、三つぐらい罠があります。(これは解説する予定はありませんが、他の方の解答・コメントは歓迎します。コメント、トラックバック、ブックマークはネタバレ有りです。念のため。

次の内部ハッシュの実装(C言語のプログラムの一部)には誤りがある。誤っている部分を正しく修正せよ。ただし、Bはハッシュ表のサイズ、hashはハッシュ関数である。ハッシュ表の要素は正の整数とし、要素の個数はハッシュ表のサイズBより小さいとする。

#define EMPTY 0
int h[B];

/* ハッシュ表hを空にする */
void clear() {
  int i;
  for (i = 0; i < B; i ++) {
    h[i] = EMPTY;
  }
}

/* 要素xをハッシュ表hに追加 */
void insert(int x) {
  int i = hash(x);
  while (h[i] != EMPTY) {
    i = (i + 1) % B;
  }
  h[i] = x;
}

/* 要素xをハッシュ表hから削除(xがhにない場合は考えなくて良い) */
void delete(int x) {
  int i = hash(x);
  while (h[i] != x) {
    i = (i + 1) % B;
  }
  h[i] = EMPTY;
}

/* 要素xがハッシュ表hにあれば1を、なければ0を返す */
int member(int x) {
  int i = hash(x);
  while (h[i] != x) {
    if (h[i] == EMPTY) return 0;
    i = (i + 1) % B;
  }
  return 1;
}