#include<stdio.h>#include<Windows.h>#include<stdlib.h>#include<iostream>#defineBUCKET_SIZE1024usingnamespacestd;#defineTABLESIZE16#definecompare(a,b)strcmp((constchar*)a,(constchar*)b)#definehash_funcSDBMHashtypedefstruct_NodeList{void*key;void*date;_NodeList*next;}ListNode,NodeList;typedefListNode*List;typedefNodeList*elem;typedefstruct_HashTable{inttableSize;List*thelist;}HashTable;unsignedintSDBMHash(void*key){unsignedinthash=0;char*str=(char*)key;while(*str){hash=(*str++)+(hash<<6)+(hash<<16)-hash;}return(hash&0x7FFFFFFF);}//哈希函数intHash(inttablesize,void*key){//return(key%tablesize);returnhash_func(key)%tablesize;}//初始化哈希链表HashTable*initHash(HashTable*&Hash,inttablesize){//初始化哈希桶Hash=(HashTable*)malloc(sizeof(HashTable));if(!Hash){printf("error!\n");returnNULL;}//给索引指针分配内存if(tablesize<0){tablesize=TABLESIZE;}Hash->tableSize=tablesize;Hash->thelist=(List*)malloc(sizeof(List)*tablesize);if(!Hash->thelist){printf("error malloc!\n");free(Hash);//return;}for(inti=0;i<tablesize;i++){//给每个哈希数组指针分配头节点的堆内存Hash->thelist[i]=(ListNode*)malloc(sizeof(ListNode));if(!Hash->thelist[i]){//释放内存printf("error malloc!\n");free(Hash->thelist);free(Hash);}else{memset(Hash->thelist[i],0,sizeof(NodeList));}}returnHash;}//通过key查找元素elemfind(HashTable*&H,void*key){if(!H)returnNULL;//找到索引下标inti=0;i=Hash(H->tableSize,key);Liste=H->thelist[i]->next;while(e!=NULL&&compare(e->key,key)){e=e->next;}//要么成功找到key,要么key不存在returne;}//插入元素boolinsertHash(HashTable*H,void*key,void*value){////if(!H)returnfalse;//通过键值找到元素eleme=find(H,key);elemtmp=NULL;elemL=NULL;//tmp可能存在也可能不存在,当e不存在时//e不存在if(!e){//tmp=(elem)malloc(sizeof(elem));tmp=(elem)malloc(sizeof(NodeList));if(tmp==NULL){printf("eroor malloc!\n");returnfalse;}L=H->thelist[Hash(H->tableSize,key)];//通过key的索引找出相应的位置tmp->date=value;tmp->key=key;tmp->next=L->next;L->next=tmp;}else{printf("the key has been exit!\n");}}//删除元素booldeleteElem(HashTable*H,void*key){////找元素elemlast=NULL;eleme=NULL;//eleme=find(H,key);//找到相应的索引位?????我在干嘛ListL=H->thelist[Hash(H->tableSize,key)];last=L;e=L->next;while(e!=NULL&&compare(e->key,key)){last=e;e=e->next;}//如果找到了这个Lif(e){//直接把它跳过last->next=e->next;delete(e);returntrue;}returnfalse;}void*Retrive(eleme){//获取表中的元素returne!=NULL?e->date:NULL;//e存在就返回他自己的值否则就返回为空}//销毁哈希表voiddestoyedHash(HashTable*&H){eleme=NULL;elemL=NULL;elemcur=NULL;for(inti=0;i<H->tableSize;i++){L=H->thelist[i];cur=L->next;while(cur!=NULL){elemtmp=cur;cur=tmp->next;free(tmp);//cur=cur->next;}free(L);}free(H->thelist);free(H);H=NULL;}
#include"Hash.h"#include<string.h>#include<stdlib.h>intmain(){char*elems[]={"BDBB","DBBB","DBCC","ASDS"};char*tester ="ABDBBBAC";char cur[5]={'\0'};int i =0;
HashTable * H =NULL;initHash(H,BUCKET_SIZE);insertHash(H,elems[0],elems[0]);insertHash(H,elems[1],elems[1]);insertHash(H,elems[2],elems[2]);insertHash(H,elems[3],elems[3]);strncpy_s(cur,tester+1,4);//这个函数的意思是截取cur指针数组中元素位置从下标1开始后4个元素
elem e =find(H,cur);if(e){printf("%s\n",(constchar*)Retrive(e));}else{printf("Not found[key:%s]\n",cur);}system("pause");return0;}