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