数据结构——哈希查找的实现(C语言)
哈希查找算法的思想:通过对元素的关键字值进行某种运算,直接求出元素的地址,即使用关键字到地址的直接转换方法,而不需要反复比较。
直接转换方法有很多,这里介绍最常用的一种方法:除留取余法,即H(key)=key%p;p一般为小于表长的最大质数。例如,表长为100,p取97.
//实现哈希查找算法 #include <stdio.h> #include <stdlib.h> #define m 20 //散列表的长度 #define n 12 //元素个数 #define t 19 //t为不大于散列表长度的最大质数 typedef struct { int key;//关键字,此处可理解为元素的大小 int compare;//比较次数 } HashTable; HashTable a[20]={0}; int b[12]={12,2,1,34,45,56,32,7,5,44,13,6}; //创建散列表 void CreatHash() { for(int i=0;i<n;i++) { int H0=b[i]%t; if(a[H0].key==0) { a[H0].key=b[i]; a[H0].compare=1; } else { for(int j=1;j<m;j++) { int H1=(H0+j)%m; if(a[H1].key==0) { a[H1].key=b[i]; a[H1].compare=1+j; break; } } } } } //散列表的查找 int SearchHash(HashTable a[20],int key) { int H0=key%t; int H1; if(a[H0].key==0) { printf("查找失败!查找次数为:%d ",a[H0].compare); return -1; } else if(a[H0].key==key) { printf("查找成功!查找次数为:%d",a[H0].compare); return H0; } else { for(int j=1;j<m;j++) { int H1=(H0+j)%m; if(a[H1].key==key) { printf("查找成功!查找次数为:%d",a[H1].compare); return H1; } else if(a[H1].key==0) { printf("查找失败!查找的次数为:%d",a[H1].compare); return -1; } } printf("查找失败!查找次数为:%d",a[H1].compare); return -1; } } int main() { int key; CreatHash(); printf("{12,2,1,34,45,56,32,7,5,44,13,6} "); printf("要查找的数为: "); scanf("%d",&key); SearchHash(a,key); return 0; }
运行结果为: