采用链地址法实现散列表查找
时间: 2023-06-18 22:03:35 浏览: 109
链地址法是一种散列表的解决方案。它的实现思路是,对于哈希冲突的键值,将它们存储在同一个链表中。下面是一个使用链地址法实现散列表查找的示例:
首先,定义一个链表节点结构体,包含键值对和指向下一个节点的指针:
```
struct ListNode {
int key;
int value;
ListNode* next;
};
```
然后,定义散列表结构体,包含一个指向链表头节点的指针数组:
```
const int TABLE_SIZE = 100;
struct HashTable {
ListNode* table[TABLE_SIZE];
};
```
在初始化散列表时,需要将每个链表的头节点初始化为空:
```
void init(HashTable& ht) {
for (int i = 0; i < TABLE_SIZE; i++) {
ht.table[i] = nullptr;
}
}
```
插入操作时,按照键值的哈希值将节点插入到相应的链表中:
```
void insert(HashTable& ht, int key, int value) {
int index = hash(key);
ListNode* node = new ListNode{key, value, nullptr};
if (ht.table[index] == nullptr) {
ht.table[index] = node;
} else {
ListNode* p = ht.table[index];
while (p->next != nullptr) {
p = p->next;
}
p->next = node;
}
}
```
查找操作时,先计算键值的哈希值,然后在相应的链表中查找节点:
```
bool find(HashTable& ht, int key, int& value) {
int index = hash(key);
ListNode* p = ht.table[index];
while (p != nullptr) {
if (p->key == key) {
value = p->value;
return true;
}
p = p->next;
}
return false;
}
```
需要注意的是,哈希函数的设计对散列表的性能影响非常大。一个好的哈希函数应该将键值均匀地分布在散列表中,尽量减少哈希冲突的发生。
阅读全文