哈希表

给定一组元素的关键字hash[] = {78,90,66,70,155,82,123,231},利用除留余数法和线性再探测散列法将元素存储再哈希表中,并查找给定的关键字,求平均查找长度。

分析:主要考察哈希表的构造和冲突解决办法
代码:


#include "pch.h"
#include <iostream>
#include<stdio.h>
#include<stdlib.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  SearchHash(HashTable H, KeyType k);
void DisplayHash(HashTable H, int m);
void HashASL(HashTable H, int m);

/*-----------主函数------------*/
int main()
{
	int hash[] = { 78,90,66,70,155,82,123,231 };
	int m = 11;
	int p = 11, n = 8, pos;
	KeyType k;
	HashTable H;
	CreateHashTable(&H, m, p, hash, n);
	DisplayHash(H, m);

	k = 155;
	pos = SearchHash(H, k);
	printf("关键字%d在哈希表中的位置为:%d\n", k, pos);
	HashASL(H, m);
	return 0;

}
/*----------函数定义------------*/
void CreateHashTable(HashTable *H, int m, int p, int hash[], int n)
//创建一个空的Hash表,并处理冲突
{
	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;//关键字设置为-1
		(*H).data[i].hi= 0;// 冲突次数为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;//关键字个数
	(*H).tablesize = m;//哈希表的长度
}

int  SearchHash(HashTable H, KeyType k)
//在哈希表中查找关键字为k的元素
{
	int d, d1, m;
	m = H.tablesize;
	d = d1 = k % m;
	while (H.data[d].key!=-1)//遇到了空位,那肯定找不到
	{
		if (H.data[d].key == k)//找到了
			return d;
		else//由于可能存在冲突可能这个关键字没有存在这个地方
		{
			d = (d + 1) % m;//继续往后查找
		}
		if (d == d1)//找完了一圈所有的位置
			return 0;
	}
	return 0;
}

void HashASL(HashTable H, int m)
//求平均查找长度
{
	float average = 0;
	int i;
	for (i = 0; i < m; i++)
	{
		average = average + H.data[i].hi;
	}
	average /= H.curSize;
	printf("平均查找长度ASL=%2f", average);
}


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");
	
}

程序运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XIE_QAID

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值