哈希表
来源:互联网 发布:商标字体设计软件 编辑:程序博客网 时间:2024/05/21 11:12
#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; }}