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 回答