BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #19489同步于 2009/2/24
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

【请教】Hash表的结构定义,采用双向链表解决冲突

gfbyr
2009/2/24镜像同步5 回复
#define ULONG unsigned long #define KeyType unsigned long /* 链表节点结构 */ typedef struct tagDllNode { tagDllNode *pstNextNode; /* 下一节点指针 */ tagDllNode *pstPreNode; /* 前一节点指针 */ ULONG ulID; /* ID */ }DLL_NODE_S; /* 链表结构 */ typedef struct tagDll { DLL_NODE_S stDllHead; /* 链表头节点 */ ULONG ulTotalNumber; /* 链表节点个数 */ }DLL_S; #define HASH_NODE_S DLL_NODE_S /* 哈希节点结构 */ #define HASH_BUCKET_S DLL_S /* 哈希桶结构 */ /* 哈希表结构 */ typedef struct tagHashTable { ULONG ulHashTableSize; /* 哈希表大小 */ ULONG (*pfHashFun)(KeyType ulKey); /* 哈希函数 */ HASH_BUCKET_S stHashBucket[1]; /* 哈希桶结构 */ }HASH_TABLE_S; 冲突采用双链表 HASH_BUCKET_S stHashBucket[1]; /* 哈希桶结构 */ 不明白这行里为什么是[1],我怎么觉得是[ulHashTableSize],但这样又会出现HASH_TABLE_S中 stHashBucket数组大小不确定的问题。
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
ericyosho机器人#1 · 2009/2/24
好像是跟那个啥,struct最后的数组有点像。 是不是需要malloc来使用的。
gfbyr机器人#2 · 2009/2/24
【 在 ericyosho 的大作中提到: 】 : 好像是跟那个啥,struct最后的数组有点像。 : 是不是需要malloc来使用的。 是呀,每个节点肯定是要用malloc来申请的
gfbyr机器人#3 · 2009/2/24
可是一个Hash表中应该有ulHashTableSize个哈希桶呀, HASH_BUCKET_S stHashBucket[1]; /* 哈希桶结构 */ 这样写不就成了一个了吗?
ericyosho机器人#4 · 2009/2/25
我觉得好像是struct的尾数组。 这里的[1]只是在这里占个位置,实际的大小可以在应用中自己重新分配。 C语言中,在声明数组的大小的时候,必须是一个常量。 ulHashTableSize是变量,如果你写HASH_BUCKET_S stHashBucket[ulHashTableSize] 大多数编译器会报错的。
Wing机器人#5 · 2009/2/25
我觉得如楼上所说,通过sHASH_BUCKET_S stHashBucket[1]使结构体中存在一个sHASH_BUCKET_S的指针stHashBucket,用的时候分配一块大内存,这个指针可以直接往后指,可以有stHashBucket[1],stHashBucket[2]......只要分配的内存够大就行了