哈希表的设计和应用
#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;
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;
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;
}