_DataStructure_C_Impl:哈希表
Posted ljbguanli
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了_DataStructure_C_Impl:哈希表相关的知识,希望对你有一定的参考价值。
#include<stdlib.h> #include<stdio.h> typedef int KeyType; //元素类型定义 typedef struct{ KeyType key; //keyword int hi; //冲突次数 }DataType; //哈希表类型定义 typedef struct{ DataType *data; int tableSize; //哈希表的长度 int curSize; //表中keyword个数 }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; //哈希表中keyword个数为n (*H).tableSize=m; //哈希表的长度 } //在哈希表H中查找keywordk的元素 int SearchHash(HashTable H,KeyType 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) //假设是要查找的keywordk,则返回k的位置 return d; else //继续往后查找 d=(d+1)%m; if(d==d1) //假设查找了哈希表中的全部位置,没有找到返回0 return 0; } return 0; //该位置不存在keywordk } //输出哈希表 void DisplayHash(HashTable H,int m){ int i; printf("哈希表地址:"); for(i=0;i<m;i++) printf("%-5d",i); printf("\n"); printf("keywordkey: "); 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"); } //求哈希表的平均查找长度 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 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("keyword%d在哈希表中的位置为:%d\n",k,pos); HashASL(H,m); system("pause"); }
以上是关于_DataStructure_C_Impl:哈希表的主要内容,如果未能解决你的问题,请参考以下文章
_DataStructure_C_Impl:AOE网的关键路径