我想定义一个带有可交换哈希函数的哈希表。散列函数将采用指向散列表的指针和要散列的键,返回一个 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 解决方案首选!