#include <iostream>
#include <cstdlib> // 包含用于 malloc() 和 srand() 的头文件
#include <ctime> // 包含用于 time() 的头文件
using namespace std;
#define SIZE 13
// 定义哈希表结构
typedef struct
{
int data[SIZE]; // 存放数据的数组
int count; // 记录当前哈希表中元素个数
} Hash;
// 初始化哈希表
Hash* InitHash()
{
// 分配内存给哈希表
Hash* ht = (Hash*)malloc(sizeof(Hash));
if (ht == NULL)
{
printf("内存分配失败!\n");
return NULL;
}
// 将哈希表中的数据初始化为-1,表示空槽位
for (int& val : ht->data)
{
val = -1;
}
ht->count = 0; // 初始元素个数为0
return ht;
}
// 哈希函数,将键映射到对应的索引
int hashCode(int key)
{
return key % SIZE;
}
// 插入操作
void Insert(Hash *ht, int key)
{
// 检查哈希表是否已满
if (ht->count >= SIZE)
{
printf("哈希表已满\n");
return;
}
int index = hashCode(key); // 计算键对应的索引
// 线性探测找到合适的位置插入
while (ht->data[index] != -1)
{
index++;
index %= SIZE;
}
ht->data[index] = key; // 插入元素
ht->count++; // 更新元素个数
}
// 查找操作
int Select(Hash* ht, int key)
{
// 检查哈希表是否为空
if (ht->count == 0)
{
printf("哈希表为空\n");
return -1;
}
int index = hashCode(key); // 计算键对应的索引
// 线性搜索链表或者数组,查找目标元素
for (int i = index; ht->data[i] != -1; )
{
if (ht->data[i] == key)
return 1; // 找到目标元素
else
{
i++;
i %= SIZE;
}
}
return 0; // 未找到目标元素
}
// 打印哈希表中的非空元素
void Print(Hash* ht)
{
for (int i = 0; i < SIZE; i++)
{
if (ht->data[i] != -1)
printf("%d ", ht->data[i]);
}
}
int main()
{
srand((unsigned int)time(NULL)); // 初始化随机数种子
int arr[10];
Hash* ht = InitHash(); // 初始化哈希表
for (int i = 0; i < 10; i++)
{
arr[i] = rand() % 100 + 1; // 生成随机数
Insert(ht, arr[i]); // 插入哈希表
}
for (int val : arr)
{
cout << val << " ";
}
cout << endl;
Print(ht); // 打印哈希表中的元素
int num;
while (1)
{
cin >> num;
cout << Select(ht, num) << endl;
}
// 释放哈希表内存
free(ht);
system("pause");
return 0;
}