实验7.1 哈希表的综合操作

头文件

#include<dos.h>
#include<conio.h>
#include<math.h>
#include<stdio.h>
#include<stdlib.h>

定义结构体

#define MAXSIZE 12    //哈希表的最大容量

enum BOOL{False,True};
enum HAVEORNOT{NULLKEY,HAVEKEY,DELKEY};  //哈希表元素的三种状态 没有记录,有记录,记录被删除
 
typedef  struct //定义哈希表的结构
{
	int elem[MAXSIZE];  //数据元素体
	HAVEORNOT elemflag[MAXSIZE]; //元素状态标记
	int count;  //哈希表当前元素的个数
}HASHTABLE;

typedef struct //定义记录的结构体
{
	int keynum; //记录的数据域
}RECORD;

哈希表初始化

void InitialHash(HASHTABLE& H)
{
	int i; //用于遍历整个哈希表
	H.count = 0;  //将元素个数都置为0
	for (i = 0;i < MAXSIZE;i++)
		H.elemflag[i] = NULLKEY;  //将元素状态都标记为无记录
}

显示哈希表所有元素及其所在位置

void PrintHash(HASHTABLE H)
{
	int i;
	if (H.count == 0)
		printf("\n\n\t哈希表为空");
	else
	{
		for (i = 0;i < MAXSIZE;i++)  //显示哈希表中记录所在位置及记录的值
		{
			if (H.elemflag[i] == HAVEKEY) //只显示标记为HAVEKEY的元素
			{
				printf("\n\t哈希表中记录所在的位置为:%d\n", i);
				printf("\n\t哈希表中记录的值为:%d\n", H.elem[i]);
			}
		}
		printf("\n\t当前哈希表所含的记录数为:%d", H.count);
	}
}

哈希函数 H(key)=key MOD 11

int Hash(int kn)
{
	return (kn % 11);
}

在开发地址哈希表H中查找关键字为k的数据元素,若查找成功,以p指示待查数据元素的地址,并返回True,否则以p指示插入位置并返回False

BOOL SearchHash(HASHTABLE H, int k, int& p)
{
	int p1;
	p1 = p = Hash(k);  //根据哈希函数求得哈希地址
	//发生冲突:线性探测
	while (H.elemflag[p] == HAVEKEY && k != H.elem[p]) //该位置有记录且关键字与要查找的值不相等
	{
		p = (p + 1) % MAXSIZE;
		if (p == p1) //整个表已经搜索完仍没有找到要查找的元素
			return False;
	}
	if (k == H.elem[p] && H.elemflag[p] == HAVEKEY)  //查找成功,p指示待查元素的位置
		return True;
	else
		return False;
}

查找不成功时插入元素e到开发地址哈希表H中,并返回true,否则false

BOOL InsertHash(HASHTABLE& H, RECORD e)
{
	int p;
	if (SearchHash(H, e.keynum, p))  //表中有与e相同的元素
		return False;
	else
	{
		H.elemflag[p] = HAVEKEY; //设置标记为HAVEKEY
		H.elem[p] = e.keynum; //插入记录
		H.count++;  //哈希表当前长度加一
		return True;
	}
}

查找成功时删除待删元素e,并返回true,否则false

BOOL DeketeHash(HASHTABLE& H, RECORD e)
{
	int p;
	if (!SearchHash(H, e.keynum, p))  //表中没有与e相同的元素
		return False;
	else
	{
		H.elemflag[p] = DELKEY; //设置标志为DELKEY
		H.count--; //哈希表当前长度减一
		return True;
	}
}

主函数

int main()
{
	HASHTABLE H; //声明哈希表H
	char j = 'y';
	int position,ch;
	RECORD R;
	BOOL temp;
	printf("\n\t\t\t\t 哈希表的综合操作");
	InitialHash(H);  //初始化哈希表
	while (j != 'n')
	{
		printf("\n\n\t\t\t1.显示哈希表");
		printf("\n\n\t\t\t2.查找元素");
		printf("\n\n\t\t\t3.插入元素");
		printf("\n\n\t\t\t4.删除元素");
		printf("\n\n\t\t\t5.退出操作");
		printf("\n\n\t\t请选择要进行的操作!");
		scanf("%d", &ch);
		switch (ch)
		{
		case 1: PrintHash(H);
			break;
		case 2: {
			if (H.count == 0)
				printf("\n\t哈希表为空");
			else
			{
				printf("\n\t请输入要查找的关键字的值");
				scanf("%d", &R.keynum);
				temp = SearchHash(H, R.keynum, position);
				if (temp)
					printf("\n\t 该元素的位置为:%d", position);
				else
					printf("\n\t该元素不存在");
			}
		}
			  break;
		case 3: {
			if (H.count == MAXSIZE)
				printf("\n\t哈希表已满");
			else
			{
				printf("\n\t请输入要插入的记录");
				scanf("%d", &R.keynum);
				temp = InsertHash(H, R);
				if (temp)
					printf("\n\t成功插入");
				else
					printf("\n\t该元素已经在表中,插入失败");
			}
		}
			  break;
		case 4: {
			if (H.count == 0)
				printf("\n\t哈希表为空");
			else
			{
				printf("\n\t请输入要删除的关键字");
				scanf("%d", &R.keynum);
				temp = DeketeHash(H, R);
				if (temp)
					printf("\n\t成功删除");
				else
					printf("\n\t该元素不在哈希表中,删除失败");
			}
		}
			  break;
		default:
			j = 'n';
			break;
		}
	}
}

运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值