#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define ERROR 0
#define SUCCESS 1
#define UNSUCCESS 0
#define DUPLICATE -1
#define NULLKEY 0
#define EQ(a,b) ((a)==(b))
typedef int Status;
typedef int KeyType;
typedef struct
{
KeyType key;
}SElemType;
int hashsize[]={3,5,11,13,17,19,23,29,31,37};//哈希表容量递增表,一个合适的素数序列
int m=0;
typedef struct
{
SElemType *elem; //动态分配数组
int count;//当前数据元素个数
int sizeindex; //hashsize[sizeindex]为当前容量
}HashTable;
Status Hash(KeyType K)
{
return(K%m);
}
Status collision(int p,int c)
{
return (p+c)%m ;
}
Status RecreatHashTable(HashTable &H)
{
H.elem=(SElemType*)realloc(H.elem,(hashsize[++H.sizeindex])*sizeof(SElemType));
return TRUE;
}
Status SearchHash(HashTable H,KeyType K,int &p,int&c)
{//在开放定址hash表H中,查找关键码为K的元素,若查找成功,以p指示待查数据在表中的位置,否则p指示插入位置
//用c记录冲突次数,初值为0,供建表插入时参考
p=Hash(K);
while(H.elem[p].key!=NULLKEY&&!EQ(K,H.elem[p].key))//该位置有记录且不相等
{
p=collision(p,++c);//求下一个比较的地址
}
if(EQ(K,H.elem[p].key))
{
return SUCCESS;
}
else return UNSUCCESS;
}
Status InsertHash(HashTable &H, SElemType e)
{
//查找不成功时插入数据e到开放定址哈希表,过大则重建哈希表
int c=0;
int p;
if(SearchHash(H,e.key,p,c))
return 0;//表中已有
else if(c<hashsize[H.sizeindex]/2)
{
H.elem[p]=e;
++H.count;
return TRUE;
}
else{RecreatHashTable(H);return ERROR;}
}
int main()
{
int i;//循环变量
SElemType e;//查找的数据
HashTable H;//哈希表
int p=0,c=0;//存放该元素在表中的位置和查找次数
H.count=0;
printf("请输入哈希表表长序号");
scanf("%d",&H.sizeindex);
m=hashsize[H.sizeindex];
H.elem=(SElemType *)malloc(hashsize[H.sizeindex]*sizeof(SElemType));
for( i=0;i<hashsize[H.sizeindex];i++)
{
H.elem[i].key=0;
}
printf("请输入元素的key值");
for( i=0;i<hashsize[H.sizeindex];i++)
{
scanf("%d",&e.key);
InsertHash(H,e);
}
printf("请输入你希望查找的关键字,我们将输出它在哈希表中的位置");
scanf("%d",&e.key);
SearchHash(H,e.key,p,c);
printf("哈希表中的位置:%d,查找次数;%d",p,c);
free(H.elem);
return 0;
}
数据结构(C)实验:hash表查找完整代码(配套严蔚敏版)
最新推荐文章于 2023-08-10 15:37:06 发布