初始化一个哈希表 HashTable。利用除留余数法构建哈希西数,并使用开放地址法解决冲突,将关键字为(12,9,15,10.8.21, 3,29,30,11,40.7的序列次存入哈希表中。 使用哈希表查找的算法查找关键字为15的数据元素
时间: 2023-06-20 11:10:04 浏览: 154
好的,让我们来一步一步地完成这个任务。
首先,我们需要定义哈希表的结构。为了方便起见,我们可以选择使用一个固定大小的数组来表示哈希表,每个数组元素将存储一个包含关键字和值的结构体。
```c
#define TABLE_SIZE 13
typedef struct {
int key;
int value;
} HashNode;
typedef struct {
HashNode nodes[TABLE_SIZE];
} HashTable;
```
接下来,我们需要实现哈希函数。这里我们选择使用除留余数法来将关键字映射为哈希表中的索引。具体来说,我们可以将关键字除以哈希表大小,然后取余数作为索引。
```c
int hash(int key) {
return key % TABLE_SIZE;
}
```
然后,我们需要实现插入数据的函数。当我们要在哈希表中插入一个新的元素时,我们首先需要计算它的哈希值,并检查该位置是否已经被占用。如果没有被占用,我们就可以直接将元素插入该位置;否则,我们需要使用开放地址法来寻找下一个可用的位置。
在这里,我们选择使用线性探测法来解决冲突。具体来说,我们从当前位置开始向后遍历哈希表,直到找到一个空闲的位置或者遍历完整个哈希表。如果找到了空闲位置,我们就可以将元素插入该位置;否则,我们将继续从开头位置开始遍历哈希表,直到找到一个可用位置。
```c
void insert(HashTable* table, int key, int value) {
int index = hash(key);
int i = index;
while (table->nodes[i].key != 0) {
i = (i + 1) % TABLE_SIZE;
if (i == index) {
printf("HashTable is full!\n");
return;
}
}
table->nodes[i].key = key;
table->nodes[i].value = value;
}
```
最后,我们需要实现查找数据的函数。当我们要在哈希表中查找一个元素时,我们首先需要计算它的哈希值,并检查该位置是否包含该元素。如果包含,我们就可以直接返回它的值;否则,我们需要使用同样的方法来寻找下一个可能包含该元素的位置。
```c
int search(HashTable* table, int key) {
int index = hash(key);
int i = index;
while (table->nodes[i].key != key) {
i = (i + 1) % TABLE_SIZE;
if (table->nodes[i].key == 0 || i == index) {
printf("Element not found!\n");
return -1;
}
}
return table->nodes[i].value;
}
```
现在,我们可以将关键字为(12,9,15,10.8.21, 3,29,30,11,40.7的序列次存入哈希表中,并使用哈希表查找的算法查找关键字为15的数据元素,代码如下:
```c
int main() {
HashTable table = {0};
int key[] = {12, 9, 15, 10, 8, 21, 3, 29, 30, 11, 40, 7};
int value[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
for (int i = 0; i < sizeof(key) / sizeof(int); i++) {
insert(&table, key[i], value[i]);
}
printf("Searching for key 15: %d\n", search(&table, 15));
return 0;
}
```
输出结果为:
```
Searching for key 15: 3
```
可以看到,我们成功地找到了关键字为15的数据元素,它的值为3。
阅读全文