题目
使用散列函数:
H(k)= 3*k mod 11
并采用链地址法处理冲突。试对关键字序列(22, 41, 53, 46, 30, 13, 01, 67)构造散列表,求等概率情况下查找成功的平均查找长度,并设计构造散列表的完整的算法。
分析
代码
核心代码:
/* ht[]指的是散列表结点数组;nums[]指的是关键字数组;n指的是关键字个数 */
void chash(HNode ht[],int nums[],int n) {
HNode *p;// 定义一个待新建结点
for(int i=0; i<maxSize; i++) {
ht[i].next=NULL;// 将散列表中所有结点都置空
}
for(int i=0; i<n; i++) { // 插入所有的关键字
p=(HNode *)malloc(sizeof(HNode));// 新建结点
p->key=nums[i];// 设置结点的关键字
int j=(3*nums[i])%maxSize;// 计算关键字在散列表中的地址
p->next=ht[j].next;// 将结点插入到ht[j]之后
ht[j].next=p;
}
}
完整代码:
#include<stdio.h>
#include<stdlib.h>
/* 哈希表的长度 */
#define maxSize 11
typedef struct HNode {
int key;
struct HNode *next;
} HNode;
/* ht[]指的是散列表结点数组;nums[]指的是关键字数组;n指的是关键字个数 */
void chash(HNode ht[],int nums[],int n) {
HNode *p;// 定义一个待新建结点
for(int i=0; i<maxSize; i++) {
ht[i].next=NULL;// 将散列表中所有结点都置空
}
for(int i=0; i<n; i++) { // 插入所有的关键字
p=(HNode *)malloc(sizeof(HNode));// 新建结点
p->key=nums[i];// 设置结点的关键字
int j=(3*nums[i])%maxSize;// 计算关键字在散列表中的地址
p->next=ht[j].next;// 将结点插入到ht[j]之后
ht[j].next=p;
}
}
/* 打印散列表 */
void print(HNode ht[]) {
printf("\n");
HNode *temp;
for(int i=0; i<maxSize; i++) {
temp=ht[i].next;
if(temp) {
while(temp) {
printf("%d\t",temp->key);
temp=temp->next;
}
printf("\n");
} else {
printf("null\n");
}
}
printf("\n");
}
int main() {
HNode ht[maxSize];
int nums[]= {22,41,53,46,30,13,1,67};
int n=8;
chash(ht,nums,n);
print(ht);
return 0;
}
运行结果: