基本原理就是:将地址冲突的一些不同的值,挂在同一条链表上。
举例代码如下:
//哈希表
/*
链地址发处理哈希冲突
2015年8月24日09:19:49
*/
#include<stdio.h>
#include<malloc.h>
#include<string.h>
typedef struct node{
char *name ;
char *desc ;
struct node *next ;
}node ;
static node * nodelist[100];//哈希表
void inithashtab( ){
int i = 0 ;
for (i;i<100 ; i++ ){
nodelist[i] = NULL ;
}
}
unsigned int hash(char *name){
int sum = 0 ;
while (*name)
sum+=*(name++);
return sum%100 ;
}
node* lookup(char *s){//确保相同的name对应相同的desc
int i = hash(s);
node *np = nodelist[i] ;
for ( ; np ; np=np->next){
if (!strcmp(np->name,s))
return np;
}
return NULL;
}
char *get_str (char *s){
int s_l = strlen(s) ;
s_l++;
char *t = (char *)malloc(sizeof(char)*s_l);
strcpy(t,s);
return t;
}
int install(char *name ,char *desc){
int i = hash(name) ;
node *np;
if ((np=lookup(name))!=NULL){
free(np->desc);
np->desc =get_str(desc);
}else{//插入新节点
// printf("1");
np = (node *)malloc(sizeof(node));
np->name = get_str(name);
np->desc = get_str(desc);
np->next = nodelist[i] ;
nodelist[i] = np ;
}
return 1;
}
char *get (char *name){
int pos = hash(name );
node *np = NULL ;
np = lookup(name);
if (!np){
return NULL;
}else{
// printf("desc: %s\n",np->desc);
return np->desc;
}
}
int main (){
inithashtab();
// printf("%s",get_str("124"));
install("name","desc") ;
install("nbmd","aaaa");
install("name","bbbb");
char *s = get("name");
printf("%s\n" , s);
printf("%s",get("nbmd"));
return 0 ;
}