returnsum;
}
构造哈希函数
intHash1(NAstr){//哈希函数
longn;
intm;
n=fold(str);//先将用户名进行折叠处理
m=n%HASHSIZE;//折叠处理后的数,用除留余数法构造哈希函数
returnm;//并返回模值
}
intHash2(NAstr){//哈希函数
longn;
intm;
n=atoi(str);//把字符串转换成整型数.
m=n%HASHSIZE;//用除留余数法构造哈希函数
returnm;//并返回模值
}
冲突处理函数,用于解决冲突
Statuscollision(intp,int&c){//冲突处理函数,采用二次探测再散列法解决冲突
inti,q;
i=c/2+1;
while(iif(c%2==0){
c++;
q=(p+i*i)%HASHSIZE;
if(q>=0)returnq;
elsei=c/2+1;
}
else{
q=(p-i*i)%HASHSIZE;
c++;
if(q>=0)returnq;
elsei=c/2+1;
}
}
returnUNSUCCESS;
}
voidbenGetTime();
voidCreateHash1(HashTable*H,Record*a){//建表,以人的姓名为关键字,建立相应的散列表benGetTime();
inti,p=-1,c,pp;
for(i=0;ic=0;
p=Hash1(a[i].name);
pp=p;
while(H->elem[pp]!
=NULL){
pp=collision(p,c);
if(pp<0){
cout<<"第"<
continue;
}//无法解决冲突,跳入下一循环
}
H->elem[pp]=&(a[i]);//求得哈希地址,将信息存入
H->count++;
cout<<"第"<
}
cout<<"\n建表完成!
\n此哈希表容量为"<count<<".\n";
benGetTime();
}
查找功能的实现
voidSearchHash1(HashTable*H,int&c){//在通讯录里查找姓名关键字,若查找成功,显示信息
benGetTime();
NAstr;
cout<<"\n请输入要查找记录的姓名:
\n";
cin>>str;
intp,pp;
p=Hash1(str);
pp=p;
while((H->elem[pp]!
=NULL)&&(eq(str,H->elem[pp]->name)==-1))
pp=collision(p,c);
if(H->elem[pp]!
=NULL&&eq(str,H->elem[pp]->name)==1){
cout<<"\n查找成功!
\n查找过程冲突次数为"<\n\n";
cout<<"姓名:
"<elem[pp]->name<<"\n电话号码:
"<elem[pp]->tel<<"\n联系地址:
"<elem[pp]->add<<"\n";
}
elsecout<<"\n此人不存在,查找不成功!
\n";
benGetTime();
}
voidbenGetTime(){
SYSTEMTIMEsys;
GetLocalTime(&sys);
cout<}
voidCreateHash2(HashTable*H,Record*a){//建表,以电话号码为关键字,建立相应的散列表
benGetTime();
inti,p=-1,c,pp;
for(i=0;ic=0;
p=Hash2(a[i].tel);
pp=p;
while(H->elem[pp]!
=NULL){
pp=collision(p,c);
if(pp<0){
cout<<"第"<
continue;
}//无法解决冲突,跳入下一循环
}
H->elem[pp]=&(a[i]);//求得哈希地址,将信息存入
H->count++;
cout<<"第"<
\n";//需要显示冲突次数时输出
}
cout<<"\n建表完成!
\n此哈希表容量为"<count<<".\n";
benGetTime();
}
voidSearchHash2(HashTable*H,int&c){//在通讯录里查找电话号码关键字,若查找成功,显示信息
benGetTime();
NAtele;
cout<<"\n请输入要查找记录的电话号码:
\n";
cin>>tele;
intp,pp;
p=Hash2(tele);
pp=p;
while((H->elem[pp]!
=NULL)&&(eq(tele,H->elem[pp]->tel)==-1))
pp=collision(p,c);
if(H->elem[pp]!
=NULL&&eq(tele,H->elem[pp]->tel)==1){
cout<<"\n查找成功!
\n查找过程冲突次数为"<\n\n";
cout<<"姓名:
"<elem[pp]->name<<"\n电话号码:
"<elem[pp]->tel<<"\n联系地址:
"<elem[pp]->add<<"\n";
}
elsecout<<"\n此人不存在,查找不成功!
\n";
benGetTime();
}
存盘功能的实现:
voidSave(){
FILE*fp;
if((fp=fopen("c:
\test.txt","w"))==NULL){
printf("\nERRORopeningcustometfile");
}
fclose(fp);
}
主界面功能的实现:
intmain(intargc,char*argv[]){
intc,flag=1;
HashTable*H;
H=(HashTable*)malloc(LEN);
for(inti=0;iH->elem[i]=NULL;
H->size=HASHSIZE;
H->count=0;
Recorda[MAXSIZE];
while
(1){
cout<<"\n┏━━━━━━━━━━━━━━━━━━━━━┓";
cout<<"\n┃欢迎使用电话号码查找系统┃";
cout<<"\n┏〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓┓";
cout<<"\n┃★★★★★★★哈希表的设计与实现★★★★★★★┃";
cout<<"\n┃【1】.添加用户信息┃";
cout<<"\n┃【2】.读取所有用户信息┃";
cout<<"\n┃【3】.以姓名建立哈希表(再哈希法解决冲突)┃";
cout<<"\n┃【4】.以电话号码建立哈希表(再哈希法解决冲突)┃";
cout<<"\n┃【5】.查找并显示给定用户名的记录┃";
cout<<"\n┃【6】.查找并显示给定电话号码的记录┃";
cout<<"\n┃【7】.清屏┃";
cout<<"\n┃【8】.保存┃";
cout<<"\n┃【9】.退出程序┃";
cout<<"\n┃温馨提示:
┃";
cout<<"\n┃Ⅰ.进行5操作前请先输出3┃";
cout<<"\n┃Ⅱ.进行6操作前请先输出4┃";
cout<<"\n┗〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓┛";
cout<<"\n";
cout<<"请输入一个任务选项>>>";
cout<<"\n";
intnum;
cin>>num;
switch(num){
case1:
getin(a);
break;
case2:
ShowInformation(a);
break;
case3:
CreateHash1(H,a);/*以姓名建立哈希表*/
break;
case4:
CreateHash2(H,a);/*以电话号码建立哈希表*/
break;
case5:
c=0;
SearchHash1(H,c);
break;
case6:
c=0;
SearchHash2(H,c);
break;
case7:
Cls(a);
break;
case8:
Save();
break;
case9:
return0;
break;
default:
cout<<"你输错了,请重新输入!
";
cout<<"\n";
}
}
system("pause");
return0;
}
四、程序测试
1、程序经测试后大部分功能正常,但是在建立哈希表后存盘出现错误,经仔细查找发现是由于定义时范围过小造成的溢出现象,经处理后程序功能一切运行正常。
2、调试后的界面:
五、总结
课程设计顺利完成,在这几天的程序测试中,虽然是按照课程设计所要求的功能进行编程,但是还是有一些功能的实现不尽人意,比如在处理冲突时,遇到寻址失败利用再哈希法解决冲突的过程中会有一些异常现象的产生。
同时经过这阶段的课程设计可以体会出团队合作的重要性。