看到了關於 散列表 的一篇質量較高的博客(就不用本身寫了,偷個懶)node
http://www.nowamagic.net/academy/detail/3008010
less
這是一個系列的教程所有看完就差很少 有個概念了 可是仍是不敢說 全懂.net
資質比較愚鈍,木辦法debug
下面的是實驗代碼 我的敲了一遍 理解了一些code
//#include "stdafx.h" #include "string.h" #include "stdio.h" #include "stdlib.h" //data struct typedef struct _node { char *name; //key char *desc; //value struct _node *next; //next node address } node; #define HASHSIZE 101 //define hashzize static node* hashtab[HASHSIZE]; void inithashtab() { int i; for(i=0; i < HASHSIZE; i++) hashtab[i]=NULL; } unsigned int hash(char *s) { unsigned int h=0; for(; *s; s++) h=*s+h*31; return h%HASHSIZE; } //look for the specific value node* lookup(char *n) { unsigned int hi=hash(n); node* np=hashtab[hi]; for(; np!=NULL; np=np->next) { if(!strcmp(np->name,n)) return np; } return NULL; } char* m_strdup(char *o) { int l=strlen(o)+1; char *ns=(char*)malloc(l*sizeof(char)); strcpy(ns,o); if(ns==NULL) return NULL; else return ns; } char* get(char* name) { node* n=lookup(name); if(n==NULL) return NULL; else return n->desc; } //散列化 鍵 爲對應的 數字 把蘿蔔放到對應的坑裏面 int install(char* name,char* desc) { unsigned int hi; node* np; if((np=lookup(name))==NULL) { hi=hash(name); np=(node*)malloc(sizeof(node)); if(np==NULL) return 0; np->name=m_strdup(name); if(np->name==NULL) return 0; np->next=hashtab[hi]; hashtab[hi]=np; } else free(np->desc); np->desc=m_strdup(desc); if(np->desc==NULL) return 0; return 1; } /* A pretty useless but good debugging function, which simply displays the hashtable in (key.value) pairs */ void displaytable() { int i; node *t; for(i=0; i < HASHSIZE; i++) { if(hashtab[i]==NULL) printf("()"); else { t=hashtab[i]; printf("("); for(; t!=NULL; t=t->next) printf("(%s.%s) ",t->name,t->desc); printf(".)"); } } } void cleanup() { int i; node *np,*t; for(i=0; i < HASHSIZE; i++) { if(hashtab[i]!=NULL) { np=hashtab[i]; while(np!=NULL) { t=np->next; free(np->name); free(np->desc); free(np); np=t; } } } } main() { int i; char* names[]= {"name","address","phone","k101","k110","nickname"}; char* descs[]= {"Sourav","Sinagor","26300788","Value1","Value2","ningjin"}; inithashtab(); for(i=0; i < 6; i++) install(names[i],descs[i]); printf("Done"); printf("If we didnt do anything wrong..""we should see %s\n",get("k110")); install("phone","9433120451"); printf("Again if we go right, we have %s and %s",get("k101"),get("phone")); printf("\nnickname:%s\n", get("nickname")); /*displaytable();*/ cleanup(); return 0; }