哈希表的设计主要是设计哈希函数
哈希函数:将关键字映射到哈希表的位置
哈希函数的建立有五种常见方法:
1. 除余法
2.折叠法
3.平方取中法
4.提取法
5. 基数转换法
哈希冲突解决方法
1. 开放定址法
开放定址法又分为线性探查法,二次探查法,双散列函数探查法
2.再哈希法
3.链地址法
4.建立一个公共溢出区
可扩展文件的散列函数
1.可扩展散列
2.线性散列
哈希程序示例:
冲突解决方法为:双散列函数探查法
哈希函数关键字为:人名字母ASCII相加
哈希函数为:关键字%M,从而映射到哈希表中的位置
代码:
#include<stdio.h>
#include<conio.h>
#define HASH_LEN 50
#define M 47
#define NAME_NO 30
typedef struct
{
char *py;
int k;
}NAME;
NAME NameList[HASH_LEN];
typedef struct
{
char *py;
int k;
int si;
}HASH;
HASH HashList[HASH_LEN];
void InitNameList() //姓名(结构体数组)初始化
{
char *f;
int r,s0,i;
NameList[0].py="wanghui";
NameList[1].py="mayuelong";
NameList[2].py="chenzhicheng";
NameList[3].py="sunpeng";
NameList[4].py="zengqinghui";
NameList[5].py="liqingbo";
NameList[6].py="liujunpeng";
NameList[7].py="jiangquanlei";
NameList[8].py="xingzhengchuan";
NameList[9].py="luzhaoqian";
NameList[10].py="gaowenhu";
NameList[11].py="zhuhaoyin";
NameList[12].py="chenlili";
NameList[13].py="wuyunyun";
NameList[14].py="huangjuanxia";
NameList[15].py="wangyan";
NameList[16].py="zhoutao";
NameList[17].py="jiangzhenyu";
NameList[18].py="liuxiaolong";
NameList[19].py="wangziming";
NameList[20].py="fengjunbo";
NameList[21].py="lilei";
NameList[22].py="wangjia";
NameList[23].py="zhangjianguo";
NameList[24].py="zhuqingqing";
NameList[25].py="huangmin";
NameList[26].py="haoyuhan";
NameList[27].py="zhoutao";
NameList[28].py="zhujiang";
NameList[29].py="lixiaojun";
for (i=0;i<NAME_NO;i++)
{
for (r=0;*(f+r)!='\0';r++)
s0=*(f+r)+s0;
NameList[i].k=s0;
} }
void CreateHashList() //建立哈希表
{int i;
for (i=0;i<HASH_LEN;i++)
void
{
printf("\n请输入姓名的拼音:");
scanf("%s",name);
for (r=0;r<20;r++)
adr=s0%M;
d=adr;
if(HashList[adr].k==s0)
else if (HashList[adr].k==0)
else
{
} }
void
{int i;
float average=0;
for(i=0; i<50; i++)
{
}
for (i=0;i<HASH_LEN;i++)
average+=HashList[i].si;
average/=NAME_NO;
printf("\n\n平均查找长度:ASL(%d)=%f \n\n",NAME_NO,average);
}
void main()
{
printf("\n
InitNameList();
CreateHashList ();
while(1)
{
printf("\n
fflush(stdin);
程序示例2:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 30
typedef enum{False,True} BOOL;
typedef enum{NULLKEY,HAVEKEY,DELKEY} HAVEORNOT;
typedef struct
{
int elem[MAXSIZE];
HAVEORNOT elemflag[MAXSIZE];
int count;
}HashTable;
typedef struct
{int keynum;
}Record;
void InitialHash(HashTable*);
void CreateHash(HashTable*);
void PrintHash(HashTable);
BOOL SearchHash(HashTable,int,int*);
BOOL InsertHash(HashTable*,Record);
BOOL DeleteHash(HashTable*,Record);
int Hash(int);
void main()
{
}
void InitialHash(HashTable *H)
{
}
void CreateHash(HashTable *H)
{
Record e;
printf("请输入的一系列整数(不超过12个,以-1结束)以建立哈希表:\n");
scanf("%d",&e.keynum);
while(e.keynum!=-1)
}
void PrintHash(HashTable H)
{
}
BOOL SearchHash(HashTable H,int k,int *p)
{
}
BOOL InsertHash(HashTable *H,Record e)
{
}
BOOL DeleteHash(HashTable *H,Record e)
{
}
int Hash(int kn)
{
}