第1关:哈希表初始化
本关任务:初始化哈希表满足下面要求。
将关键字序列(7、8、30、11、18、9、14)散列存储到散列表中,
散列函数为: H(key) = (key*3) MOD 7,处理冲突采用线性探测再散列法,要求装填(载)因子为0.7。
初始化的哈希表中元素均为-1。
第2关:输出哈希表
本关任务:
完成函数,能根据哈希表结构输出哈希表的元素。元素之间以空格隔开
第3关:插入键值(线性探测再散列法处理冲突)
本关任务:
编写一个能将键值插入哈希表的函数,要求按线性探测再散列法处理冲突)
答案
// Created by Mr.Chen on 2023/11/1.
//#ifndef CLIONPROJECTS_HASH_H
//#define CLIONPROJECTS_HASH_H
#include <stdio.h>
#include <stdlib.h>
/*哈希结构*/
typedef struct hashTable
{
int* element;//存放键值的连续空间起始地址
int maxNum;// 哈希表长度
int curNum;//当前哈希表已有数据元素
}hashTable;
typedef hashTable* pHashTable;
typedef struct node
{
int data ;
struct node* next;
}node;
typedef struct hashTable_link
{
node* element;
int maxNum;// 哈希表长度
}hashTable_link;
typedef hashTable_link* pHashTable_link;
/*第一关*/
//初始化一个哈希表,能满足线性探测再散列处理冲突法使用,初始化哈希表元素均为-1,表示该位置为空,可插入
pHashTable initHashTable_linear()
{
//分配空间
pHashTable table = (pHashTable)malloc(sizeof(struct hashTable));
table->maxNum = 10;
table->element = (int*)malloc(sizeof (int) * table->maxNum);
//变量初始化
for(int i = 0; i < table->maxNum; i++)
{
table->element[i] = -1;
}
table->curNum = 0;
return table;
}
//初始化一个哈希表,能满足拉链法处理冲突法使用。初始化哈希表元素为0,用于计算该条链中数据个数,在插入时增加
pHashTable_link initHashTable_link()
{
//分配空间
pHashTable_link table = (pHashTable_link)malloc(sizeof(struct hashTable_link));
table->maxNum = 10;
table->element = (node*)malloc(sizeof(node) * table->maxNum);
//变量初始化
for (int i = 0; i < table->maxNum; i++)
{
table->element[i].data = 0;
table->element[i].next = NULL;
}
return table;
}
/*第二关*/
//输出线性探测再散列法构建的哈希表,从下标为0的元素开始输出,每输出一个数据空一格
void printHashTable(pHashTable h)
{
for (int i = 0; i < h->maxNum; i++)
{
printf("%d ",h->element[i]);
}
}
/*第三关*/
//哈希函数,h(key) = (key*3) % 7
int hashFun(int key)
{
return (key*3) % 7;
}
//函数功能:计算key的哈希地址,若发生冲突,则使用线性探测再散列的方法查找合适的插入位置下标,并返回该下标
int findPos(pHashTable h , int key)
{
int d = hashFun(key); //d为地址单元
for (int i = 0; i < h->maxNum; i++)
{
if(h->element[d] == -1) //有空位
return d;
else //发送冲突
d = (d + 1) % h->maxNum; //依次探查以下地址单元:d+1,d+2,...,h->maxNum-1,0,1,..,d-1
}
return -1; //散列表溢出
}
//插入键值函数,若哈希表空间已满,则返回-1,否则返回插入位置下标
int insertKey(pHashTable h , int key)
{
if(h->curNum == h->maxNum)
return -1;
int pos = findPos(h, key); //处理冲突后的哈希地址
h->element[pos] = key;
h->curNum++;
return pos;
}
//#endif //CLIONPROJECTS_HASH_H