哈希表的操作 短命女 2022-06-14 07:23 167阅读 0赞 #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); } 程序运行结果如图: ![这里写图片描述][SouthEast] [SouthEast]: /images/20220614/80288d4a765a4320b7729cd7c3d22cb9.png
相关 哈希表基本操作 哈希表是不用通过比较数值的查找方法,相当便利,建立了数值与存储地址的联系,但是everything都不可能那么完美,它存在冲突,解决冲突的方法:线性探测、那个平方(就是1的平方 亦凉/ 2024年02月18日 22:23/ 0 赞/ 49 阅读
相关 哈希表 ![Center][] [Center]: /images/20220731/1379dbdc6efb4a42a0b011f0b3aa4455.png 「爱情、让人受尽委屈。」/ 2022年08月14日 04:56/ 0 赞/ 199 阅读
相关 哈希表 什么是哈希表 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的[数据结构][Link 1]。也就是说,它通过把关键码 悠悠/ 2022年07月15日 12:14/ 0 赞/ 215 阅读
相关 哈希表的操作 include<stdio.h> typedef int keytype; typedef struct /元素类型定义/ { 短命女/ 2022年06月14日 07:23/ 0 赞/ 168 阅读
相关 哈希表 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速 系统管理员/ 2022年06月10日 01:26/ 0 赞/ 272 阅读
相关 哈希表 我们知道,通过对数组进行直接寻址(Direct Addressing),可以在 O(1) 时间内访问数组中的任意元素。所以,如果存储空间允许,可以提供一个数组,为每个可能的关键 快来打我*/ 2022年06月05日 02:20/ 0 赞/ 380 阅读
相关 哈希表操作 include <stdio.h> include <stdlib.h> include <conio.h> define HASHTABLE_ 向右看齐/ 2022年04月14日 06:12/ 0 赞/ 176 阅读
相关 哈希表 一、简介 如果所有的键都是小整数,那么我们可以用一个数组来实现无序的符号表,将键作为数组的索引i而数组中i(键)处储存的就是对应的值。 这样就可以快速地访问任意键的值, 旧城等待,/ 2021年12月22日 01:21/ 0 赞/ 420 阅读
相关 哈希表 【一】哈希表 > 他通过把关键码值映射到表中的一个位置来访问记录,以加快查找的速度。这个映射函数就是散列函数。 ![watermark_type_ZmFuZ3poZW5na 傷城~/ 2021年08月11日 17:13/ 0 赞/ 574 阅读
还没有评论,来说两句吧...