#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:哈希表
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
1.顺序表的实现——C语言
顺序表各种操作的代码实现
顺序表 冒泡排序 算法 随机数 -
【LeetCode】705. 设计哈希集合
【LeetCode】705. 设计哈希集合
leetcode 数据结构与算法 C++ -
C#哈希表
哈希表:也称散列表,一个哈希对象它由键(key)和值(value)组成,他们存储在由哈希函
散列表 c# 哈希算法 键值对 System -
C++简单哈希表
简单的哈希表。。一个数组。。装着每一个链表的首地址。需要Node**mListmList=new Node*[siz
哈希表 C++ List i++ #include -
C语言哈希表的实现
使用C语言实现HashMap写这个HashMap的最初目的是在单片机上使用,后来就着学
哈希表 hashcode C语言实现哈希表 #define sed -
哈希表 Hashtable c# 1613537346
哈希表 Hashtable c# 1613537346使用命名空间
数据 键值对 c# 取值 命名空间 -
C实现哈希表
使用C语言、数组与链表的组合实现哈希表数据结构。 可以学习链表操作及C文件组织。 难度: 初级。
c 数组 哈希表 链表 程序