16,473
社区成员
发帖
与我相关
我的任务
分享
// 结点数据结构
typedef struct HashNode{
int key;
struct HashNode* next;
}HashNode;
// hash表
typedef struct HashLink{
HashNode* hashNode[14]; // 模拟,长度定为14
}HashLink;
int Hash(int key)
{
return key % 13; // 取<14的素数
}
// 初始化hash table,建立n个带头结点的空链表
void InitHashTable(HashLink& hashLink)
{
for (int i = 0; i < sizeof(hashLink.hashNode)/sizeof(int); i++)
{
HashNode* node = new HashNode;
node->next = NULL;
hashLink.hashNode[i] = node;
}
}
// 销毁hash table
void DestroyHashTable(HashLink& hashLink)
{
for (int i = 0; i < sizeof(hashLink.hashNode)/sizeof(int); i++)
{
HashNode* node = hashLink.hashNode[i];
while (node != NULL)
{
HashNode* del = node;
node = node->next;
delete del;
}
}
}
// 关键字搜索
HashNode* SearchInHash(HashLink& hashLink, int key)
{
int pos = Hash(key);
HashNode* node = hashLink.hashNode[pos]->next;
while (node != NULL)
{
if (node->key == key)
return node;
node = node->next;
}
return node;
}
// 建立hash table
bool InsertHash(HashLink& hashLink, int key)
{
if (SearchInHash(hashLink, key) != NULL)
return false;
int pos = Hash(key);
HashNode* node = hashLink.hashNode[pos];
while (node->next != NULL)
{
// 保持关键字在同一线性链表中按需排列
if (node->next->key > key)
{
break;
}
node = node->next;
}
HashNode* newNode = new HashNode;
newNode->key = key;
newNode->next = node->next;
node->next = newNode;
return true;
}