哈希表的实例 (六)

2014-11-24 03:23:27 · 作者: · 浏览: 1
&p)

操作结果:在表中二次探测数据,返回数据的插入位置;

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()

查找用户

考察ASL1

二次探测解决冲突hashsearch2()

查找用户

考察ASL

显示电话簿disp()

(四) 详细设计

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