操作结果:在表中二次探测数据,返回数据的插入位置;
void disp(Hashtable h)
操作结果:显示出哈希表中储存的电话记录;
}ADT hashtable
将每个人的信息作为一条记录,包括电话号码、用户名、地址,还有一个整型变量用来记录冲突的次数,便于计算ASL,然后哈希表由记录数组、表现存量、容量组成,具体数据类型见下:
typedef struct {
char name[30];
char address[20];
char num[30];
}record;
typedef struct{
record data[Size];
int count;
int size;
}Hashtable;
关键字处理-----利用一个函数将表示电话号码的字符串转换成其相应的数字,然后把这些数字之和作为关键字。具体函数见下:
int exchange(char str[])
{
int i,n,sum=0;
n=strlen(str);
for(i=0;i sum=sum+str[i]-'0'; return sum; } 最后就是用两种方法建表,分别用线性和二次探测的方法来处理冲突。 本程序所有函数清单: void init(Hashtable &h);//哈希表的初始化 int exchange(char str[]);//求取关键字 int HashSearch1(Hashtable &h,char *str,int &p);//线性探测处理冲突 int HashSearch2(Hashtable &h,char *str,int &p);//二次探测处理冲突 void disp(Hashtable h);//显示哈希表 int menu();//主菜单 void main();//主函数 各函数之间的调用关系是: 主函数main() 菜单函数menu() 线性探测解决冲突hashserch1() (四) 详细设计 1)为了实现上述程序的功能,需要定义下述数据类型: typedef struct{ char name[30]; char address[20]; //float num; char num[30]; int c;//统计比较次数 }record; //记录 typedef struct{ record data[Size]; int count; int size; }Hashtable; //哈希表 2)一些主要的函数: int exchange(char str[]) //关键字处理函数 { int i,n,sum=0; n=strlen(str); for(i=0;i sum=sum+str[i]-'0'; return sum; } int HashSearch1(Hashtable &h,char *str,int &p) //线性探测 { int i,j,k=exchange(str); j=k%Size; if(strcmp(str,h.data[j].num)==0) { return j; h.data[j].c++;//! }//没有发生冲突,比较一次查找成功 if(h.data[j].num[0]==0) { p=j; return 0; } else { h.data[j].c++;//! i=(j+1)%Size;//第1次解决冲突 while(h.data[i].num[0]!=0&&i!=j) { if(strcmp(str,h.data[j].num)==0) { h.data[j].c++;//! return i; }//发生冲突,比较若干次查找成功 i=(i+1)%Size; //向后探测一个位置 } if (i==j) printf("溢出\n"); else { p=i; h.data[j].c++;//! return 0;//查找不成功 } } } int HashSearch2(Hashtable &h,char *str,int &p) //二次探测 { int i,j,t=1,d=1; int k=exchange(str); j=k%Size; if(strcmp(str,h.data[j].num)==0) { h.data[j].c++;//! return j; } //没有发生冲突,比较一次查找成功 if(h.data[j].num[0]==0) { p=j; return 0; } else { i=(j+d)%Size;//第1次解决冲突 while(h.data[i].num[0]!=0&&i!=j) { if(strcmp(str,h.data[j].num)==0) { h.data[j].c++;//! return i; } if(t>0) t=-1*d*d; else { d=d+1; t=-1*d*d ; } i=(j+t+Size)%Size; //探测一个新的位置 while(i<0) { h.data[j].c++;//! i=(i+Size)%Size; } if (i==j) printf("溢出\n"); else { p=i; h.data[j].c++;//! return 0;//查找不成功时插入 } } } } (五) 调试分析 本实验的运行环境是VC++。按照要求,应该事先导入一些记录,以下为本实验的测试数据: 4 侯进斌 北京 6627584 王璐 太原 6
查找用户
考察ASL1
二次探测解决冲突hashsearch2()
查找用户
考察ASL
显示电话簿disp()