5

スワップ可能なハッシュ関数を使ってハッシュテーブルを定義したいと思います。ハッシュ関数は、ハッシュテーブルとハッシュされるキーへのポインターを受け取り、次のようなintを返します。

typedef int (hash_function_t) (hashtable *, int);

ここで、ハッシュテーブルには、キーのハッシュに使用される関数へのポインターが格納されます。

typedef struct ht {
  size_t size;
  ...
  hash_function_t *hash_function;
} hashtable;

残念ながら、これは循環参照を作成します。

ハッシュ関数定義にハッシュテーブルへのポインターが必要です。これにより、ハッシュテーブルのサイズに対してモジュラスを実行できるため、バケットの最大数を超えません。ハッシュ関数ポインターをあちこちに渡す必要がないように、ハッシュテーブルにハッシュ関数が必要です。

私はこれが次のようなコードにつながることを理解しています:

*ht->hash_function (ht, key)

これは少し奇妙ですが、私はそれで大丈夫です。

typedefをどちらかの順序で配置しても機能しません。ハッシュテーブルで長い定義を使用し、後でtypedefを実行する必要がありますか、それともより良い方法がありますか?

これはすべてストレートCで意図されており、C++ではありません。ANSI Cソリューションをお勧めします!

4

1 に答える 1

12

定義で使用する前に、構造を宣言できます。これは、構造が存在することをコンパイラーに通知しますが、後で完全に定義されます。このようなもの:

/* declare it first */
struct ht;

typedef int (hash_function_t) (struct ht *, int);

typedef struct ht {
  size_t size;
  ...
  hash_function_t *hash_function;
} hashtable;
于 2010-12-11T09:42:22.313 に答える