C语言哈希表的简单实现——数组+链表(拉链法)
1.哈希表简介
哈希表详细介绍可以参考这篇文章
2.哈希表拉链法实现
2.1完全由本人思路实现,如有错误,欢迎批评指正
哈希声明文件hash.h
#ifndef __HASH_H_
#define __HASH_H_
#define size 100
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct hash_value_{
int _int_key;
double _double_key;
float _float_key;
char _char_key;
char *_str_key;
int _int;
double _double;
float _float;
char _char;
char *_str;
struct hash_value_ * _hash_value_next;
}hash_value;
hash_value *hash_arry[size];
void hash_default(hash_value *hash_arry_[]);
int hash_int(int key);
int hash_double(double key);
int hash_float(float key);
int hash_char(char key);
int hash_charstr(char *key);
bool add_mod_key_value_int(int key,int value);
int get_key_value_int(int key);
bool add_mod_key_value_charstr_int(char *key,int value);
int get_key_value_charstr_int(char *key);
#endif
哈希实现hash.c
#include "hash.h"
#include "string.h"
void hash_default(hash_value *hash_arry_[]){
for(int i=0;i<size;++i){
hash_arry_[i]=NULL;
}
}
int hash_int(int key){
return key%size;
}
int hash_double(double key){
return (int)key%size;
}
int hash_float(float key){
return (int)key%size;
}
int hash_char(char key){
return (int)key%size;
}
int hash_charstr(char *key){
int x=0;
int i=0;
while(*(key+i)!='\0'){
x=x+(int)(*key);
i++;
}
return x%size;
}
bool add_mod_key_value_int(int key,int value){
hash_value *head=hash_arry[hash_int(key)];
hash_value *p=NULL;
while(head){
if(key==head->_int_key){
head->_int=value;
break;
}
if(head->_hash_value_next==NULL) break;
if(key>head->_int_key&&key<head->_hash_value_next->_int_key) break;
head=head->_hash_value_next;
}
hash_value *V=(hash_value *)malloc(sizeof(hash_value));
if(head==NULL) {
V->_int_key = key;
V->_int = value;
V->_hash_value_next = NULL;
hash_arry[hash_int(key)]=V;
}
else {
V->_int_key = key;
V->_int = value;
p = head->_hash_value_next;
head->_hash_value_next= V;
V->_hash_value_next = p;
}
return true;
}
int get_key_value_int(int key){
int *x;
x=(int *)malloc(2*sizeof(int));
hash_value *head=hash_arry[hash_int(key)];
while(head){
if(key==head->_int_key){
return head->_int;
}
if(key>head->_int_key&&key<head->_hash_value_next->_int_key){
return -1;
}
head=head->_hash_value_next;
}
return -1;
}
bool add_mod_key_value_charstr_int(char *key,int value){
hash_value *head=hash_arry[hash_charstr(key)];
hash_value *p=NULL;
while(head){
if(strcmp(key,head->_str_key)){
head->_int=value;
break;
}
if(head->_hash_value_next==NULL) break;
head=head->_hash_value_next;
}
hash_value *V=(hash_value *)malloc(sizeof(hash_value));
if(head==NULL) {
V->_str_key = key;
V->_int = value;
V->_hash_value_next = NULL;
hash_arry[hash_charstr(key)]=V;
}
else {
V->_str_key = key;
V->_int = value;
p = head->_hash_value_next;
head->_hash_value_next= V;
V->_hash_value_next = p;
}
return true;
}
int get_key_value_charstr_int(char *key){
int *x;
x=(int *)malloc(2*sizeof(int));
hash_value *head=hash_arry[hash_charstr(key)];
while(head){
if(strcmp(key,head->_str_key)==0){
return head->_int;
}
head=head->_hash_value_next;
}
return -1;
}
测试文件main.c
#include "hash.h"
#include "stdio.h"
int main(int argc,char *argv[]){
int arry_key[10000];
int arry[10000];
char *arrystr[10]={
"agcdef",
"dasdawenei",
"liasdawxuan",
"apple",
"yiyaasdwen",
"asdwert",
"laasdnshasdu",
"chenchegfhfghng",
"qwe",
"rrrr",
};
int arrystrint[10];
hash_default(hash_arry);
printf("**********\n");
printf("**********\n");
for(int i=0;i<10;++i){
arrystrint[i]=i;
add_mod_key_value_charstr_int(*(arrystr+i),arrystrint[i]);
}
printf("**********\n");
while (1)
{
char x[1024];
scanf("%s",x);
printf("key:%s,value:%d\n",x,get_key_value_charstr_int(x));
}
return 0;
}