#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
typedef struct Node{
char *str;
struct Node *next;
}Node;
typedef struct HashTable{
Node **data;
int size;
}HashTable;
Node *initNode(char *str){
Node *n=(Node *)malloc(sizeof(Node));
//n->str = (char *)malloc(strlen(str)+1);
//strcpy(n->str,str);
n->str = strdup(str);
n->next = NULL;
return n;
}
void freeNode(Node *p){
if(!p)
return ;
free(p->str);
free(p);
return ;
}
HashTable *initHashTable(int n){
HashTable *h = (HashTable *)malloc(sizeof(HashTable));
h->size = 2*n;
h->data = (Node**)calloc(h->size,sizeof(Node *));
/*x相当于for(i = 0;i<h->size;i++){
h->data[i] = o;
}*/
return h;
}
void freeList(Node *head){
if(!head)
return ;
Node *k;
if(head){
k = head;
head = head->next;
freeNode(k);
}
}
void freeHashTable(HashTable *h){
int i;
for(i=0;i<h->size;i++){
freeList(h->data[i]);
}
free(h->data);
free(h);
return ;
}
//插入
Node *insertNode(Node *head, Node *p){
p->next = head;
return p;
}
int BKDHash(char *str){
int seed = 31,hash = 0;
while(*str){
hash = hash * seed +str[0];//变乱
str++;
}
return hash && 0x7fffffff;//32bit
}
int insert_HashTable(HashTable *h,char *str){
if(!h)
return 0;
int hash = BKDHash(str);
int idx = hash%h->size;//随机的一个位置
h->data[idx] = insertNode(h->data[idx],initNode(str));
return 1;
}
//查找
Node *searchList(Node *head,char *str){
while(head && strcmp(head->str,str))
head = head->next;
return head;
}
Node *searchHash(HashTable *h,char *str){
if(!h)
return NULL;
int hash = BKDHash(str);
int idx = hash%h->size;
return searchList(h->data[idx],str);
}
//生成随机长度的随机字符串
char *makeStr(char *str,int n){
int len = rand()%(n-1)+1;
char tmp;
int i;
for(i = 0; i<len; i++){
switch(rand()%3){
case 0:
tmp = 'A' + rand()%26;
break;
case 1:
tmp = 'a' + rand()%26;
break;
case 2:
tmp = '0' + rand()%10;
break;
default:
tmp ='x';
}
str[i] = tmp;
}
str[len] = 0;
return str;
}
int main(){
srand(time(0));
char str[8];
int cnt = 10;
HashTable *h = initHashTable(10);
while(cnt--){
makeStr(str,8);
insert_HashTable(h,str);
printf("%s",str);
}
putchar(10);
while(~scanf("%s",str)){
if(!strcmp(str,"q"))//按q退出
break;
Node *f = searchHash(h,str);
if(f)
printf("hash = %d addr = %p str = %s\n",BKDHash(str),f,f->str);
else
printf("%s not found~\n",str);
}
freeHashTable(h);
return 0;
}
【哈希算法学习】
最新推荐文章于 2024-10-04 20:50:17 发布