HASH表(拉链法和数组)

hash表(拉链法):主要针对关键字是字符串,将字符串hash到链表数组

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node{
    char *name;
    char *desc;
    struct node *next;
}node;
#define hashsize 100
static node *hashtable[hashsize];
unsigned int hashh(char *s){
     unsigned int seed=131;
     unsigned int h=0;
     while(*s){
        h=h*seed+(*s++);
     }
     return (h&0x7FFFFFFF)%hashsize;
}
node* lookup(char *str){
    unsigned int hashvalue=hashh(str);
    node* np=hashtable[hashvalue];
    for(;np!=NULL;np=np->next){

        if(!strcmp(np->name,str))
            return np;
    }
    return NULL;
}
char* search_str(char* name){
    node* np=lookup(name);

    if(np==NULL){
        return NULL;
    }
    else
        return np->desc;
}
node* malloc_node(char* name,char* desc){
   node *np=(node*)malloc(sizeof(node));
   if(np==NULL)
    return NULL;
   np->name=name;
   np->desc=desc;
   np->next=NULL;
   return np;
}
int insert_node(char* name,char* desc){
    unsigned int hashvalue;
    hashvalue=hashh(name);
    node* np=malloc_node(name,desc);
    if(np==NULL) return 0;
    np->next=hashtable[hashvalue];
    hashtable[hashvalue]=np;
    return 1;
}
void display()
{
    node *np;
    unsigned int hashvalue;
    for(int i=0;i<hashsize;i++){
        if(hashtable[i]!=NULL){
            np=hashtable[i];
            printf("\nhashvalue: %d (",i);
            for(;np!=NULL;np=np->next){
                printf(" (%s.%s) ",np->name,np->desc);
            }
            printf(")\n");
        }
    }
}
void cleanup()
{
    node *np,*tmp;
    for(int i=0;i<hashsize;i++){
        if(hashtable[i]!=NULL){
            np=hashtable[i];
            while(np!=NULL){
                tmp=np->next;
                free(np->name);
                free(np->desc);
                free(np);
                np=tmp;
            }
        }
    }
}
int main()
{
      char* name[]={"First Name","Last Name","address","phone","k101","k110"};
      char* descs[]={"Kobe","Bryant","USA","26300788","Value1","Value2"};
      for(int i=0;i<6;i++){
        insert_node(name[i],descs[i]);
      }
      printf("we should see %s\n",search_str("k110"));
      int n=insert_node("phone","9433120451");
      printf("we have %s and %s\n",search_str("k101"),search_str("phone"));
      display();
      cleanup();
      return 0;
}

hash表(数组):主要针对关键字是整数,将整数hash到整数数组中,减少数组大小的开辟,节省空间,可以把极大数hash

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<stdlib.h>
using namespace std;
const int hashsize=12;
const int nullkey=-32768;
typedef struct{
     int *elem;
     int count;
}hashtable;
int inithashtable(hashtable *h)
{
     h->count=hashsize;
     h->elem=(int *)malloc(sizeof(int)*hashsize);
     for(int i=0;i<hashsize;i++){
         h->elem[i]=nullkey;
     }
     return 1;
}
int hashh(int key)
{
    return key%hashsize;
}
void insert_e(hashtable *h,int key)
{
    int addr=hashh(key);
    while(h->elem[addr]!=nullkey){
        addr=(addr+1)%hashsize;
    }
    h->elem[addr]=key;
}
int search_e(hashtable h,int key,int *addr)
{
       *addr=hashh(key);
       while(h.elem[*addr]!=key){
        *addr=(*addr+1)%hashsize;
        if(h.elem[*addr]==nullkey||*addr==hashh(key)){
            return -1;
        }
       }
       return 1;
}
int main()
{
      int a[]={19987,7894,74,87,9875};
      hashtable h;
      inithashtable(&h);
      for(int i=0;i<5;i++){
        insert_e(&h,a[i]);
      }
      for(int i=0;i<hashsize;i++){
        printf("%d ",h.elem[i]);
      }
      printf("\n");
      int addr;
      search_e(h,9875,&addr);
      printf("%d\n",addr);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值