链地址处理哈希冲突方法

来源:互联网 发布:淘宝食品店需要什么 编辑:程序博客网 时间:2024/06/05 05:31

基本原理就是:将地址冲突的一些不同的值,挂在同一条链表上。

举例代码如下:

//哈希表/*链地址发处理哈希冲突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 ;}

1 1