数据结构(C)实验:hash表查找完整代码(配套严蔚敏版)

#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;
}

















  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值