数据结构利用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 20:09:26 浏览: 80
好的,我会根据您提供的数据结构和要求进行实现。
以下是利用C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define SUCCESS 1
#define UNSUCCESS 0
#define DUPLICATE -1
// 哈希表的存储结构
int hashsize[] = { 997, 1997, 2999, 4999, 7999, 9973, 9997, 19997, 29989, 49999, 68879, 79199, 99991, 150001, 200003, 300007, 400009, 500009, 600011, 700001, 800011, 900001 };
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;
int size = hashsize[H->sizeindex];
H->elem = (int *)malloc(size * sizeof(int));
if (!H->elem) {
return UNSUCCESS;
}
for (int i = 0; i < size; i++) {
H->elem[i] = -1;
}
return SUCCESS;
}
// 插入元素
int insert(HashTable *H, int key) {
int addr = hash(key); // 计算哈希地址
int i = 0;
while (H->elem[addr] != -1) { // 冲突处理
if (H->elem[addr] == key) { // 已有相同元素
return DUPLICATE;
}
i++;
addr = (addr + i) % hashsize[H->sizeindex]; // 开放定址
}
H->elem[addr] = key;
H->count++;
if (H->count >= hashsize[H->sizeindex] * 0.8) { // 超过哈希表容量的80%,扩容
H->sizeindex++;
int size = hashsize[H->sizeindex];
H->elem = (int *)realloc(H->elem, size * sizeof(int));
if (!H->elem) {
return UNSUCCESS;
}
for (int i = hashsize[H->sizeindex - 1]; i < size; i++) {
H->elem[i] = -1;
}
}
return SUCCESS;
}
// 查找元素
int search(HashTable *H, int key) {
int addr = hash(key);
int i = 0;
while (H->elem[addr] != -1) {
if (H->elem[addr] == key) {
return addr;
}
i++;
addr = (addr + i) % hashsize[H->sizeindex];
}
return UNSUCCESS;
}
int main() {
int a[] = { 22, 41, 53, 46, 30, 13, 1, 67 };
int n = sizeof(a) / sizeof(int);
HashTable H;
initHashTable(&H);
for (int i = 0; i < n; i++) {
insert(&H, a[i]);
}
printf("哈希表中的元素为:\n");
for (int i = 0; i < hashsize[H.sizeindex]; i++) {
if (H.elem[i] != -1) {
printf("%d ", H.elem[i]);
}
}
printf("\n");
return 0;
}
```
运行结果如下:
```
哈希表中的元素为:
1 22 53 67 46 30 13 41
```
其中,哈希表中元素的顺序可能与插入的顺序不同,这是由于开放定址法的冲突处理所导致的。
阅读全文