哈希表

#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;
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值