您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > C/C++资料 > 数据结构C语言版 哈希表
数据结构C语言版哈希表.txtゅ你不用一上线看见莪在线,就急着隐身,放心。莪不会去缠你。说好的不离不弃现在反而自己却做不到╮/*数据结构C语言版哈希表P259编译环境:Dev-C++4.9.9.2日期:2011年2月15日*/#includestdio.h#includemalloc.h#defineNULLKEY0//0为无记录标志#defineN10//数据元素个数typedefintKeyType;//设关键字域为整型typedefstruct{KeyTypekey;intord;}ElemType;//数据元素类型//开放定址哈希表的存储结构inthashsize[]={11,19,29,37};//哈希表容量递增表,一个合适的素数序列intm=0;//哈希表表长,全局变量typedefstruct{ElemType*elem;//数据元素存储基址,动态分配数组intcount;//当前数据元素个数intsizeindex;//hashsize[sizeindex]为当前容量}HashTable;#defineSUCCESS1#defineUNSUCCESS0#defineDUPLICATE-1//构造一个空的哈希表intInitHashTable(HashTable*H){inti;(*H).count=0;//当前元素个数为0(*H).sizeindex=0;//初始存储容量为hashsize[0]m=hashsize[0];(*H).elem=(ElemType*)malloc(m*sizeof(ElemType));if(!(*H).elem)exit(0);//存储分配失败for(i=0;im;i++)(*H).elem[i].key=NULLKEY;//未填记录的标志return1;}//销毁哈希表HvoidDestroyHashTable(HashTable*H){free((*H).elem);(*H).elem=NULL;(*H).count=0;(*H).sizeindex=0;}//一个简单的哈希函数(m为表长,全局变量)unsignedHash(KeyTypeK){returnK%m;}//开放定址法处理冲突voidcollision(int*p,intd)//线性探测再散列{*p=(*p+d)%m;}//算法9.17//在开放定址哈希表H中查找关键码为K的元素,若查找成功,以p指示待查数据//元素在表中位置,并返回SUCCESS;否则,以p指示插入位置,并返回UNSUCCESS//c用以计冲突次数,其初值置零,供建表插入时参考。intSearchHash(HashTableH,KeyTypeK,int*p,int*c){*p=Hash(K);//求得哈希地址while(H.elem[*p].key!=NULLKEY&&!(K==H.elem[*p].key)){//该位置中填有记录.并且关键字不相等(*c)++;if(*cm)collision(p,*c);//求得下一探查地址pelsebreak;}if(K==H.elem[*p].key)returnSUCCESS;//查找成功,p返回待查数据元素位置elsereturnUNSUCCESS;//查找不成功(H.elem[p].key==NULLKEY),p返回的是插入位置}intInsertHash(HashTable*,ElemType);//对函数的声明//重建哈希表voidRecreateHashTable(HashTable*H)//重建哈希表{inti,count=(*H).count;ElemType*p,*elem=(ElemType*)malloc(count*sizeof(ElemType));p=elem;printf(重建哈希表\n);for(i=0;im;i++)//保存原有的数据到elem中if(((*H).elem+i)-key!=NULLKEY)//该单元有数据*p++=*((*H).elem+i);(*H).count=0;(*H).sizeindex++;//增大存储容量m=hashsize[(*H).sizeindex];p=(ElemType*)realloc((*H).elem,m*sizeof(ElemType));if(!p)exit(0);//存储分配失败(*H).elem=p;for(i=0;im;i++)(*H).elem[i].key=NULLKEY;//未填记录的标志(初始化)for(p=elem;pelem+count;p++)//将原有的数据按照新的表长插入到重建的哈希表中InsertHash(H,*p);}//算法9.18//查找不成功时插入数据元素e到开放定址哈希表H中,并返回1;//若冲突次数过大,则重建哈希表。intInsertHash(HashTable*H,ElemTypee){intc,p;c=0;if(SearchHash(*H,e.key,&p,&c))//表中已有与e有相同关键字的元素returnDUPLICATE;elseif(chashsize[(*H).sizeindex]/2)//冲突次数c未达到上限,(c的阀值可调){//插入e(*H).elem[p]=e;++(*H).count;return1;}elseRecreateHashTable(H);//重建哈希表return0;}//按哈希地址的顺序遍历哈希表voidTraverseHash(HashTableH,void(*Vi)(int,ElemType)){inti;printf(哈希地址0~%d\n,m-1);for(i=0;im;i++)if(H.elem[i].key!=NULLKEY)//有数据Vi(i,H.elem[i]);}//在开放定址哈希表H中查找关键码为K的元素,若查找成功,以p指示待查数据//元素在表中位置,并返回SUCCESS;否则,返回UNSUCCESSintFind(HashTableH,KeyTypeK,int*p){intc=0;*p=Hash(K);//求得哈希地址while(H.elem[*p].key!=NULLKEY&&!(K==H.elem[*p].key)){//该位置中填有记录.并且关键字不相等c++;if(cm)collision(p,c);//求得下一探查地址pelsereturnUNSUCCESS;//查找不成功(H.elem[p].key==NULLKEY)}if(K==H.elem[*p].key)returnSUCCESS;//查找成功,p返回待查数据元素位置elsereturnUNSUCCESS;//查找不成功(H.elem[p].key==NULLKEY)}voidprint(intp,ElemTyper){printf(address=%d(%d,%d)\n,p,r.key,r.ord);}intmain(){ElemTyper[N]={{17,1},{60,2},{29,3},{38,4},{1,5},{2,6},{3,7},{4,8},{60,9},{13,10}};HashTableh;inti,j,p;KeyTypek;InitHashTable(&h);for(i=0;iN-1;i++){//插入前N-1个记录j=InsertHash(&h,r[i]);if(j==DUPLICATE)printf(表中已有关键字为%d的记录,无法再插入记录(%d,%d)\n,r[i].key,r[i].key,r[i].ord);}printf(按哈希地址的顺序遍历哈希表:\n);TraverseHash(h,print);printf(请输入待查找记录的关键字:);scanf(%d,&k);j=Find(h,k,&p);if(j==SUCCESS)print(p,h.elem[p]);elseprintf(没找到\n);j=InsertHash(&h,r[i]);//插入第N个记录if(j==0)//重建哈希表j=InsertHash(&h,r[i]);//重建哈希表后重新插入第N个记录printf(按哈希地址的顺序遍历重建后的哈希表:\n);TraverseHash(h,print);printf(请输入待查找记录的关键字:);scanf(%d,&k);j=Find(h,k,&p);if(j==SUCCESS)print(p,h.elem[p]);elseprintf(没找到\n);DestroyHashTable(&h);system(pause);return0;}/*输出效果:表中已有关键字为60的记录,无法再插入记录(60,9)按哈希地址的顺序遍历哈希表:哈希地址0~10address=1(1,5)address=2(2,6)address=3(3,7)address=4(4,8)address=5(60,2)address=6(17,1)address=7(29,3)address=8(38,4)请输入待查找记录的关键字:17address=6(17,1)重建哈希表按哈希地址的顺序遍历重建后的哈希表:哈希地址0~18address=0(38,4)address=1(1,5)address=2(2,6)address=3(3,7)address=4(4,8)address=6(60,2)address=10(29,3)address=13(13,10)address=17(17,1)请输入待查找记录的关键字:13address=13(13,10)请按任意键继续...*/
本文标题:数据结构C语言版 哈希表
链接地址:https://www.777doc.com/doc-7028825 .html