数据结构 - 哈希表的设计和应用

哈希表的设计和应用

#include<stdio.h>
#include<string.h>
#define NAMESIZE 6 
#define HASHSIZE 10 
#define R 23
int count=1;
void C_hashtable2() ;
void C_hashtable1() ;
int hashphone(char p[]);
int hashname(char na[]);
void collison1(int i);
void collison2(int i);
struct user{
	char phone[11];
	char name[20];
	char address[50];
	int ascii1;
	int ascii2;
}man[NAMESIZE]; 
struct hash1{
	char name[20];
	int hashna;
	int s;
}hashtable1[HASHSIZE];
struct hash2{
	char phone[11];
	int hashph;
	int s;
}hashtable2[HASHSIZE];
int hashphone(char p[]){
 	int i,n,sum=0;
	n=strlen(p);
	for(i=n-4;i<n;i++){
		sum=sum*10+(p[i]-64);
	}
	return sum;
}
int hashname(char na[]){
	int n,i,sum=0;
	n=strlen(na);
	for(i=0;i<n;i++){
		sum=sum+na[i];
	}
	return sum;
}
void C_hashtable1()                                      //创建哈希表 
{
    int i,key;
    for(i=0;i<HASHSIZE;i++){
        hashtable1[i].hashna=0;//初始化哈希表
        hashtable1[i].s=0;
    }
    for(i=0;i<NAMESIZE;i++){
        key=(man[i].ascii1)%R;                        //除留余数法
        if(hashtable1[key].s == 0 )                      //未发生冲突
        {
            hashtable1[key].name[20]=man[i].name[20];
            hashtable1[key].hashna=man[i].ascii1;
            hashtable1[key].s=1;
        }
        else                                                //发生冲突
        collison1(i);                                 //调用冲突函数
    }
}
void C_hashtable2()                                      //创建哈希表 
{
    int i,key;
    for(i=0;i<HASHSIZE;i++){
        hashtable2[i].hashph=0;//初始化哈希表
        hashtable2[i].s=0;
    }
    for(i=0;i<NAMESIZE;i++){
        key=(man[i].ascii2)%R;                        //除留余数法
        if(hashtable2[key].s == 0 )                      //未发生冲突
        {
            hashtable2[key].phone[11]=man[i].phone[11];
            hashtable2[key].hashph=man[i].ascii2;
            hashtable2[key].s=1;
        }
        else                                                //发生冲突
        collison2(i);                                 //调用冲突函数
    }
}
void collison1(int i){//冲突函数,线性探查法 
    int key,flag;
    flag=0;                                                           //未探测至末尾
    key=(man[i].ascii1)%R;
    while(hashtable1[key].s != 0){
        key=key+1; 
      //  printf("%d",key);                                             //线性探测每次加1
        if(key==HASHSIZE-1){                                          //探测至哈希表末端
            key=0;
            flag=1;                                                    //探测至末尾标识                       
        }
    }
    if(hashtable1[key].s==0){
        hashtable1[key].name[20]=man[i].name[20];
        hashtable1[key].hashna=man[i].ascii1;
        if(flag==0)
        hashtable1[key].s= (key-(man[i].ascii1%R))+1 ;
        else
        hashtable1[key].s= (HASHSIZE-(man[i].ascii1%R))+key+1;   //查找次数                                  
    }
}
void collison2(int i){//冲突函数,线性探测法 
    int key,flag;
    flag=0;                                                           //未探测至末尾
    key=(man[i].ascii2)%R;
    while(hashtable2[key].s != 0){
        key=key+1; 
      //  printf("%d",key);                                             //线性探测每次加1
        if(key==HASHSIZE-1){                                          //探测至哈希表末端
            key=0;
            flag=1;                                                    //探测至末尾标识                       
        }
    }
    if(hashtable2[key].s==0){
        hashtable2[key].phone[11]=man[i].phone[11];
        hashtable2[key].hashph=man[i].ascii2;
        if(flag==0)
        hashtable2[key].s= (key-(man[i].ascii2%R))+1 ;
        else
        hashtable2[key].s= (HASHSIZE-(man[i].ascii2%R))+key+1;   //查找次数                                  
    }
}
int main(){
	int i;
	char c;
	FILE *fp;
	fp=fopen("data.txt","r");
	while((c=fgetc(fp)) != EOF ){
		if(c == '\n')
		count++;
	}
	fclose(fp);
	fp=fopen("data.dat","r");
	for(i=0;i<count;i++){
		fscanf(fp,"%s%s%s",man[i].phone,man[i].name,man[i].address);
		man[i].ascii2=hashphone(man[i].phone);
		man[i].ascii1=hashname(man[i].name);//获得各个人的姓名和手机号的哈希函数值 
	}
    while(1){
    C_hashtable1( );
    C_hashtable2( );
    
    }
	return 0;
} 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值