6-4 创建哈希表及查找(拉链法) (10分)
实现哈希表创建及查找算法,哈希函数使用除余法,用拉链法处理冲突。
函数接口定义:
void CreateHash(HashTable HT[],int n); //输入不大于m的n个不为0(0表示空值)的数,用拉链法解决冲突构造散列表
float ASL(HashTable HT[]); //计算平均查找长度
其中 HT 表示哈希表, n表示记录数。
裁判测试程序样例:
#include<iostream>
using namespace std;
#define P 13
typedef struct HashNode{
int key;
struct HashNode *next;
}HashNode,* HashTable;
void CreateHash(HashTable HT[],int n);
float ASL(HashTable HT[]);
int main()
{
int i,n;
HashTable HT[P];
for(i=0;i<P;i++)
HT[i]=NULL;
cin >> n;
CreateHash(HT,n);
cout << ASL(HT);
return 0;
}
/* 请在这里填写答案 */
输入样例:
12
19 14 23 1 68 20 84 27 55 11 10 79
输出样例:
输出拓扑序列。
1.75
答案样例:
void CreateHash(HashTable HT[], int n) {//创作不易,点个赞吧,新春快乐~
int hash_table[P];//创建一个辅助数组
int temp;//存放余数
for(int i=0; i<n; i++)
cin >> hash_table[i];
for(int i=0; i<n; i++) {
temp = hash_table[i] % P;//求余数
if(HT[temp]==NULL) {//头为空插头后面
HT[temp] = (HashTable)malloc(sizeof(HashNode));
HashTable p = (HashTable)malloc(sizeof(HashNode));
p->key = hash_table[i];
HT[temp]->next = p;
p->next = NULL;
} else {//头不为空找到尾,查到尾后面
HashTable p = (HashTable)malloc(sizeof(HashNode));
p = HT[temp];
while(p->next!=NULL) {
p = p->next;
}
HashTable q = (HashTable)malloc(sizeof(HashNode));
q->key = hash_table[i];
p->next = q;
q->next = NULL;
}
}
}
//计算平均查找长度
float ASL(HashTable HT[]) {
double sum=0, len=0;//sum记录总步数,len记录有几个元素
for(int i=0; i<P; i++) {
if(HT[i] == NULL)
continue;
int cnt=1;
HashTable p = (HashTable)malloc(sizeof(HashNode));
p = HT[i];
while(p->next!=NULL) {
p = p->next;
sum+=cnt;
cnt++;
len++;
}
}
return sum/len;//总步数除以元素个数也就是平均查找长度
}
感谢您的阅读,点个赞吧❤⭐
哔哩哔哩/bilibili:羊卓的杨
公众号:羊卓的杨