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);
}