#include <stdio.h>
typedef char * element;
typedef struct {element *e ; int max_size ; int now_size ;} hash_table;
void init_hash_table (hash_table * , int );
void insert_hash_table (hash_table * , element [] , int (*fn)( hash_table * , element ) );
int cal_hash_code_fn_1(hash_table * , element );
int find_from_hash_table(hash_table * , element , int (*fn)(hash_table * , element) );
int find_hash_code_fn_1(hash_table * , element );
int main ()
{
hash_table ht;
init_hash_table(&ht , 100);
element strs[] =
{
"1111111111111111111",
"222222222222",
"233333333333",
"asdsadadasdasds",
"fdsgdfdfdfgdffgdfs"
};
insert_hash_table(&ht , strs , &cal_hash_code_fn_1 );
//print 1
printf("%d\n" , find_from_hash_table(&ht , "asdsadadasdasds" , &find_hash_code_fn_1) );
//print 0
printf("%d\n" , find_from_hash_table(&ht , "22222dasda" , &find_hash_code_fn_1) );
getchar();
return 0;
}
//初始化哈希表
void init_hash_table (hash_table *ht , int max_size )
{
ht->e = (element *) malloc ( max_size * sizeof(element) );
int i ;
for( i = 0 ; i < max_size ; i++ )
*((ht->e)+i) = NULL;
ht->max_size = max_size;
ht->now_size = 0;
}
//插入到哈希表
void insert_hash_table (hash_table *ht , element es[] , int (*fn)( hash_table * , element ) )
{
int i ;
for( i = 0 ; i < 4 ; i++ )
*(ht->e + (*fn)( ht, *(es+i)) ) = *(es+i);
}
//计算哈希值 (线性探测再散列)
int cal_hash_code_fn_1( hash_table * ht , element e)
{
int i ;
i = 0 ;
while (1)
{
if( *( ht->e + ((*e) % 100) + i ) == NULL)
return ((*e) % 100)+i;
++i;
}
}
//查找
int find_from_hash_table(hash_table *ht , element e , int (*fn)(hash_table * , element) )
{
return (*fn)(ht , e);
}
//查找方式一
int find_hash_code_fn_1(hash_table *ht , element e)
{
int i , j ;
i = 0 ;
while (1)
{
if( *( ht->e + ((*e) % 100) + i ) != NULL)
{
j = 0;
while ( *(*( ht->e + ((*e) % 100) + i )+j) == *(e+j) )
{
if( ( *(*( ht->e + ((*e) % 100) + i )+j) == '\0' ) && ( *(e+j) == '\0' ) )
return 1;
j++;
}
return 0;
}
++i;
}
}
07-31
07-31
07-31