: .
歹EASTCHINAINSTITUTEOFTECHNOLOGY
申请新的结点newphone,newname即新的号码和名字
Newphone=input()
Newname指向newphone
调用hash()函数
调用hash()函数
拉链法处理冲突
利用用户名为关键字插入
结束
调用hash()函数中新结点q指向
phone[key]->next
q=q->next
输出无记//输出相应
录//记录
结束
四,设计算法
建立节点structnode(
charname[8],address[20];
charnum[11];
node*next;
};
typedefnode*pnode;〃可以为一个已有的数据类型声明多个别名,这里为该类型声明了两个指针
typedefnode*mingzi;
node**phone;
node**nam;
node*a;
哈希函数的定义
本程序要设计两个hash()函数,分别对应电话号码和用户名。对关键字进行模运算,将运算结果所得的余数作为关键字(或结点)的存储地址,方法如下:以电话号码为关键字
建立哈希函数hash(charnum[11])。以用户名为关键字建立哈希函数hash2(charname[8])。利
用强制类型转换,将用户名的每一个字母的ASCLL码值相加并且除以20后的余数。将计
算出来的数作为该结点的地址赋给key2o
voidhash(charnum[11]);//以电话号码为关键字建立哈希函数
〃哈希函数的主旨是将电话号码的十一位数字全部加起来(inti=3;
key=(int)num[2];
while(num[i]!=NULL)(key+=(int)num[i];i++;
)
key=key%20;"/利用强制类型转换,将用户名的每一个字母的ASCLL码值相加并且除
以20后的余数
voidhash2(charname[8]);//哈希函数以用户名为关键字建立哈希函数(
inti=1;
key2=(int)name[0];
while(name[i]!=NULL)(key2+=(int)name[i];i++;
)
key2=key2%20;
)
哈希查找
想要实现查找功能,同样需要两个查找函数,无论以用户名还是以电话号码为关键字,
首先,都需要利用hash函数来计算出地址。再通过比对,如果是以电话号码为关键字,比较其电话号码是否相同,如果相同则输出该结点的所有信息,如果以用户名为关键字,则比
较用户名是否相同,如果相同则输出该结点的所有信息。如果找不到与之对应相同的,则输
出“无此记录”。
voidfind(charnum[11]);//在以电话号码为关键字的哈希表中查找用户信息
(
hash(num);
node*q=phone[key]->next;
while(q!=NULL)
(
if(strcmp(num,q->num)==0)
break;
q=q->next;
}if(q)printf("%s_%s_%s\n",q->name,q->address,q->num);
elseprintf("无此记录\n");
}
voidfind2(charname[8]);//在以用户名为关键字的哈希表中查找用户信息
(
hash2(name);
node*q=nam[key2]->next;
while(q!=NULL)
(
if(strcmp(name,q->name)==0)break;
q=q->next;
)
程序测试
首先键入0,添加结点信息,然后按1进行查找,分别进行号码和姓名查找,最后可在主菜中,选择号码散列和姓名散列,由此查看程序运行结果。
至此,就解决了哈希表的设计与实现算法可能出现的各种问题,那么根据以上思路以及对问
题的分析和对出现情况的解决则可以写出源程序。
五,使用说明与测试结果
使用说明
由于address[20]、name[8]和num[11]可以看出地址可输入的最大字符数是20,姓名可
输入的最大字符数是8,电话号码都为11位。
主菜单截图
:录录列列录统山江话7记记系(九电56加找名担W3八西入?;番一姓口WHS!
C:\DOCU1EITSODSETTINGS\ADIISISTRATOK\.
添加的内容:
哈希表实验报告 来自淘豆网m.daumloan.com转载请标明出处.