链表法哈希表
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#include
//#define NULLKEY -1
#define HASH_LEN 50 //哈希表的长度
#define M 47
#define NAME_NO 30 //人名的个数
typedef struct NAME
{
char *name; //名字的拼音
int key; //拼音所对应的整数
struct NAME *link;
}NAME;
NAME NameList[HASH_LEN];
typedef struct hterm //哈希表
{
char *name; //名字的拼音
int key; //拼音所对应的整数
int si; //查找长度
}HASH;
HASH HashList[HASH_LEN];
void InitNameList()
{
NameList[0].name="lidong";
NameList[1].name="zhouyan";
NameList[2].name="liyanqiu";
NameList[3].name="huangjing";
NameList[4].name="yaoqianqian";
NameList[5].name="shengjunhui";
NameList[6].name="liujiawei";
NameList[7].name="zhanghuaiping";
NameList[8].name="wangyuxiang";
NameList[9].name="zhenshaonan";
NameList[10].name="xuyani";
NameList[11].name="yuhongzhen";
NameList[12].name="zhangxiaodan";
NameList[13].name="wuguohua";
NameList[14].name="zhouyunjia";
NameList[15].name="huangsijie";
NameList[16].name="yeyiyi";
NameList[17].name="linqianqian";
NameList[18].name="tongxianan";
NameList[19].name="zhangtingting";
NameList[20].name="zhoujie";
NameList[21].name="hexiaochen";
NameList[22].name="tongmengting";
NameList[23].name="liujingjing";
NameList[24].name="huangqichuan";
NameList[25].name="jiangjiamin";
NameList[26].name="shileyun";
NameList[27].name="zhouchenjing";
NameList[28].name="zhangxiaoyu";
NameList[29].name="wangyuxiang";
char *f;
int r,s0;
int i;
for ( i=0;i
s0=0;
f=NameList[i].name;
for (r=0;*(f+r) != '\0';r++) //方法:将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字
s0=*(f+r)+s0;
NameList[i].key=s0;
}
}
void CreateHashList()//建立哈希表
{
int i=0;
for(i=0;i
HashList[i].name="";
HashList[i].key=0;
HashList[i].si=0;
}
for (i=0;i
int sum=0;
int adr ; //哈希函数
int d ;
adr=(NameList[i].key) % M;
d=adr;
if(HashList[adr].si==0) //如果不冲突
{
HashList[adr].key=NameList[i].key;
HashList[adr].name=NameList[i].name;
HashList[adr].si=1;
}
else //冲突 :用 线性探测再散列(开放定址法)
{
do
{
d=(d+((NameList[i].key))%10+1)%M; //伪散列
sum=sum+1; //查找次数加1
}while (HashList[d].key!=0);
HashList[d].key=NameList[i].key;
HashList[d].name=NameList[i].name;
HashList[d].si=sum+1;
}
}
}
void FindList() /* 查找 */
{
printf("\n\nplease spell the name: "); //输入姓名
char name[20]={0};
scanf("%s",name);
int s0=0;
for (int r=0;r<20;r++
) //求出姓名的拼音所对应的整数(关键字)
s0+=name[r];
int sum=1;
int adr=s0 % M; //除留余数法求哈希地址
int d=adr;
//分3种情况进行判断:
if(HashList[adr].key==s0) //关键字等于地址,符合
printf("\nname:%s key word:%d searching length: 1",HashList[d].name,s0);
else if (HashList[adr].key==0) //关键字等于0
printf("NO RECORD!");
else//其他情况
{
int g=0;
do
{
d=(d+s0%10+1)%M; //伪散列
sum=sum+1;
if (HashList[d].key==0)
{
printf("NO RECORD! ");
g=1;
}
if (HashList[d].key==s0)
{
printf("\nname:%s key word:%d length:%d",HashList[d].name,s0,sum);
g=1;
}
}while(g==0);
}
}
void Display() //显示哈希表
{ int i;
printf("\n\naddress\tkey word\tlength\t H(key)\t pinyin \n"); //显示的格式(通过控制空格来控制排列整齐)
for(i=0; i<50; i++)
{
printf("%d ",i);
printf("\t%d ",HashList[i].key);
printf("\t\t%d ",HashList[i].si);
printf("\t\t%d ",(HashList[i].key)%M);
printf("\t %s ",HashList[i].name);
printf("\n");
}
float average=0;
for (i=0;i
average/=NAME_NO;
printf("\n\nthe average of search length:ASL(%d)=%f \n\n",NAME_NO,average);
}
void main()//主函数
{
printf("\n*-*-*-*-*-*-*-*-*-*-*-*-* E-comerce 1101 HASH TABLE -*-*-*-*-*-*-*-*-*-*-*-*-");
printf("\n*-*-*-*-*-*-*-*-*-*-*-*-*-*we are waiting for you*-*-*-*-*-*-*-*-*-*-*-*-*-*-");
InitNameList();
CreateHashList ();
while(1)
{
printf("\n");
printf(" ★☆☆★☆☆★☆☆★★press a key to show the menu★☆☆★☆☆★☆☆★★☆");
getchar();
printf("\n\n");
printf("\n★☆☆★☆☆★☆☆★★☆☆★☆☆★☆☆★★☆☆★☆☆★☆☆★☆☆★☆☆★☆☆\n");
printf("☆ 1.show me the hash table ★\n");
printf("★ 2. find the name ☆\n");
printf("☆ 3. exit ★\n");
printf("★☆☆★☆☆★☆☆★★☆☆★☆☆★☆☆★★☆☆★☆☆★☆☆★☆☆★☆☆★☆☆\n\n");
printf("please show me the correct choice: ");
char ch1;
scanf("%c",&ch1);
getchar();
fflush(stdin);
if (ch1=='1')
Display();
else if (ch1=='2')
FindList();
else if (ch1=='3')
{ puts("Bye Bye ^_^");
return;
}
}
}