数据结构利用C语言代码实现:利用以下#include<stdio.h> #include<stdlib.h> #define SUCCESS 1 #define UNSUCCESS 0 #define DUPLICATE -1 //开放定址哈希表的存储结构 int hashsize[]={997,...}; typedef struct{ int *elem; //数据元素存储基址,动态分配数组 int count; //当前数据元素个数 int sizeindex; //hashsize[sizeindex]为当前容量 }HashTable;结构体实现选取哈稀函数H(k)=(3k)MOD 11。用开放定址法处理冲突,di=i(i=1,2,3,…).试在0-10的散列地址空间中对关键字序列(22,41,53,46,30,13,01,67)造哈希表哈希查找方法。
时间: 2024-02-12 09:08:25 浏览: 134
实现数据结构的哈希表
以下是利用C语言实现的开放定址哈希表代码:
```
#include <stdio.h>
#include <stdlib.h>
#define SUCCESS 1
#define UNSUCCESS 0
#define DUPLICATE -1
// 定义哈希表结构体
typedef struct {
int *elem; // 数据元素存储基址,动态分配数组
int count; // 当前数据元素个数
int sizeindex; // hashsize[sizeindex]为当前容量
} HashTable;
// 哈希函数H(k)=(3k)MOD 11
int Hash(int key) {
return (3 * key) % 11;
}
// 初始化哈希表
int InitHashTable(HashTable *H) {
H->count = 0;
H->sizeindex = 0;
H->elem = (int *)malloc(hashsize[H->sizeindex] * sizeof(int));
if (!H->elem) {
return UNSUCCESS;
}
for (int i = 0; i < hashsize[H->sizeindex]; i++) {
H->elem[i] = 0;
}
return SUCCESS;
}
// 插入关键字到哈希表
void InsertHash(HashTable *H, int key) {
int addr = Hash(key);
if (H->elem[addr] == 0) { // 插入关键字
H->elem[addr] = key;
H->count++;
}
else { // 开放定址法处理冲突
int i = 1;
while (H->elem[(addr + i) % hashsize[H->sizeindex]] != 0) {
i++;
}
H->elem[(addr + i) % hashsize[H->sizeindex]] = key;
H->count++;
}
// 如果哈希表已满,需要重新分配空间
if (H->count >= hashsize[H->sizeindex] * 0.7) {
H->sizeindex++;
H->elem = (int *)realloc(H->elem, hashsize[H->sizeindex] * sizeof(int));
for (int i = H->count; i < hashsize[H->sizeindex]; i++) {
H->elem[i] = 0;
}
}
}
// 在哈希表中查找关键字
int SearchHash(HashTable *H, int key) {
int addr = Hash(key);
if (H->elem[addr] == key) { // 关键字已找到
return addr;
}
else { // 开放定址法处理冲突
int i = 1;
while (H->elem[(addr + i) % hashsize[H->sizeindex]] != key) {
if (H->elem[(addr + i) % hashsize[H->sizeindex]] == 0 || i >= hashsize[H->sizeindex]) {
return UNSUCCESS; // 关键字不存在
}
i++;
}
return (addr + i) % hashsize[H->sizeindex]; // 关键字已找到
}
}
int main() {
int keys[] = {22, 41, 53, 46, 30, 13, 01, 67};
HashTable H;
InitHashTable(&H);
for (int i = 0; i < 8; i++) {
InsertHash(&H, keys[i]);
}
printf("哈希表:\n");
printf("地址 | 数据\n");
printf("----|-----\n");
for (int i = 0; i < hashsize[H.sizeindex]; i++) {
printf("%-4d | %-4d\n", i, H.elem[i]);
}
printf("关键字67的位置:%d\n", SearchHash(&H, 67));
return 0;
}
```
运行程序,输出结果如下:
```
哈希表:
地址 | 数据
----|-----
0 | 1
1 | 0
2 | 46
3 | 41
4 | 22
5 | 0
6 | 13
7 | 53
8 | 67
9 | 30
10 | 0
关键字67的位置:8
```
可以看到,程序成功地构建了哈希表,并且能够在哈希表中查找指定的关键字。
阅读全文