哈希表的操作
来源:互联网 发布:arduino json 编辑:程序博客网 时间:2024/06/05 06:47
#include<stdio.h>typedef int keytype;typedef struct /*元素类型定义*/{ keytype key; /*关键字*/ int hi; /*冲突次数*/}DataType;typedef struct /*哈希表类型定义*/{ DataType *data; int tablesize; /*哈希表的长度*/ int cursize; /*表中关键字个数*/}HashTable;void CreateHashTable(HashTable *H,int m,int p,int hash[],int n)/*构造一个空的哈希表,并处理冲突*/{ int i,sum,addr,di,k=1; (*H).data=(DataType *)malloc(m*sizeof(DataType)); /*为哈希表分配空间*/ if(!(*H).data) exit(-1); for(i=0;i<m;i++) /*初始化哈希表*/ { (*H).data[i].key=-1; (*H).data[i].hi=0; } for(i=0;i<n;i++) /*求哈希函数地址并处理冲突*/ { sum=0; /*冲突的次数*/ addr=hash[i]%p; /*利用除留余数法求哈希函数的地址*/ di=addr; if((*H).data[addr].key==-1) /*如果不冲突则将元素存储在表中*/ { (*H).data[addr].key=hash[i]; (*H).data[addr].hi=1; } else /*用线性探测再散列法处理冲突*/ { do { di=(di+k)%m; sum+=1; }while((*H).data[di].key!=-1); (*H).data[di].key=hash[i]; (*H).data[di].hi=sum+1; } } (*H).cursize=n; /*哈希表中关键字个数为n*/ (*H).tablesize=m; /*哈希表的长度*/}int SearchHash(HashTable H,keytype k)/*在哈希表H中查找关键字为k的元素*/{ int d,d1,m; m=H.tablesize; d=d1=k%m; /*求k的哈希地址*/ while(H.data[d].key!=-1) { if(H.data[d].key==k) /*如果是要查找的关键字k,则返回k的位置*/ return d; else d=(d+1)%m; if(d==d1) /*如果查找了哈希表中的所有位置,没有找到返回0*/ return 0; } return 0; /*该位置不存在关键字k*/}void HashASL(HashTable H,int m)/*求哈希表的平均长度*/{ float average=0; int i; for(i=0;i<m;i++) average=average+H.data[i].hi; average=average/H.cursize; printf("平均查找长度ASL=%.2f",average); printf("\n");}void DisplayHash(HashTable H,int m) /*输出哈希表*/{ int i; printf("哈希表地址:"); for(i=0;i<m;i++) printf("%-5d",i); printf("\n"); printf("关键字key:"); for(i=0;i<m;i++) printf("%-5d",H.data[i].key); printf("\n"); printf("冲突次数:"); for(i=0;i<m;i++) printf("%-5d",H.data[i].hi); printf("\n");}main(){ int Hash[]={23,35,12,56,123,39,342,90}; int m=11,p=11,n=8,pos; keytype k; HashTable H; CreateHashTable(&H,m,p,Hash,n); DisplayHash(H,m); k=123; pos=SearchHash(H,k); printf("关键字%d在哈希表中的位置为:%d\n",k,pos); HashASL(H,m);}
程序运行结果如图:
阅读全文
0 0
- 哈希表的操作
- 数据结构之---哈希表的操作
- 哈希表的一些基本操作
- 短信的各种操作操作
- jquery的操作,dom操作
- 哈希表(散列表)的基本操作
- (005)线性哈希表的相关操作
- 哈希表操作
- 操作哈希表
- 哈希表操作
- 哈希表操作
- javascript的$的操作
- excel 单sheet 操作 + 复杂的操作
- 【并发操作】多用户并发操作的解决方案
- 信号量的P操作和V操作
- vim 删除操作的一些操作
- C# 二进制文件操作 简单的文件操作
- 总线的操作时序和操作方式
- http://www.cnblogs.com/ylbtech/p/6292424.html
- select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET
- mybatis foreach 出错
- 洛谷P1850 换教室noip提高day1题
- [Amazon Alexa开发]为自己的App申请Login with Amazon的key
- 哈希表的操作
- Http、Https 和 Socket 的区别与联系
- 九度1046:求最大值
- 【C++细节】友元函数
- HTML语言
- Linux下统计当前文件夹下的文件个数、目录个数
- APK签名原理
- 队列——链式存储结构及其基本运算(链队列的另一种表达方式)
- Android 任务和返回栈