数据结构《散列查找算法的实现》课程设计

主要功能:创建哈希表、显示哈希表、查找、删除某个元素、插入某个元素

//开放地址法构造的哈希表的运算算法
#include<iostream>
using namespace std;
#include <stdio.h>
#define MaxSize 100			//定义最大哈希表长度
#define NULLKEY -1			//定义空关键字值
#define DELKEY -2			//定义被删关键字值
typedef int KeyType;		//关键字类型
typedef struct
{
	KeyType key;			//关键字域
	int count;				//探测次数域
} HashTable;				//哈希表类型
void InsertHT(HashTable ha[],int &n,int m,int p,KeyType k)  //将关键字k插入到哈希表中
{
	int i,adr;
	adr=k % p;					//计算哈希函数值
	if (ha[adr].key==NULLKEY || ha[adr].key==DELKEY)//k可以直接放在哈希表中
	{
		ha[adr].key=k;
		ha[adr].count=1;
	}
	else						//发生冲突时采用线性探测法解决冲突
	{
		i=1;					//i用来记录k发生冲突的次数
		do 
		{
			adr=(adr+1) % m;	//线性探测
			i++;
		} while (ha[adr].key!=NULLKEY && ha[adr].key!=DELKEY);
		ha[adr].key=k;			//在adr处放置k
		ha[adr].count=i;		//设置探测次数
	}
	n++;						//总关键字个数增1
	
}
void CreateHT(HashTable ha[],int &n,int m,int p,KeyType keys[],int n1)  //创建哈希表
{
	for (int i=0;i<m;i++)				//哈希表置空的初值
    {
        ha[i].key=NULLKEY;
	    ha[i].count=0;
    }
	n=0;
	for (int i=0;i<n1;i++)
		InsertHT(ha,n,m,p,keys[i]);	//插入n个关键字
}
void SearchHT(HashTable ha[],int m,int p,KeyType k)  //在哈希表中查找关键字k
{
	int i=1,adr;
	adr=k % p;					//计算哈希函数值
	while (ha[adr].key!=NULLKEY && ha[adr].key!=k)
	{
		i++;					//累计关键字比较次数
		adr=(adr+1) % m;		//线性探测
	}
	if (ha[adr].key==k)			//查找成功
		printf("成功:关键字%d,比较%d次\n",k,i);
	else						//查找失败
		printf("失败:关键字%d,比较%d次\n",k,i);
}
bool DeleteHT(HashTable ha[],int &n,int m,int p,KeyType k)	//删除哈希表中关键字k
{
	int adr;
	adr=k % p;					//计算哈希函数值
	while (ha[adr].key!=NULLKEY && ha[adr].key!=k)
		adr=(adr+1) % m;		//线性探测
	if (ha[adr].key==k)			//查找成功
	{
		ha[adr].key=DELKEY;		//删除关键字k
		return true;
	}
	else						//查找失败
		return false;			//返回假
}
void ASL(HashTable ha[],int n,int m,int p)	//求平均查找长度
{
	int i,j;
	int succ=0,unsucc=0,s;
	for (i=0;i<m;i++)
		if (ha[i].key!=NULLKEY)
			succ+=ha[i].count;		//累计成功时总关键字比较次数
//	printf(" 成功情况下ASL(%d)=%g\n",n,succ*1.0/n);
	cout<<"成功情况下ASL"<<succ*1.0/n<<endl;
	for (i=0;i<p;i++)
	{
		s=1; j=i;
		while (ha[j].key!=NULLKEY)
		{
			s++;
			j=(j+1) % m;
		}
		unsucc+=s;
	}
	printf(" 不成功情况下ASL(%d)=%g\n",n,unsucc*1.0/p);
//	cout<<"不成功情况下ASL:  "<<unsucc*1.0/p<<endl; 
}
void DispHT(HashTable ha[],int n,int m,int p)  //输出哈希表
{
	int i,j;
	int succ=0,unsucc=0,s;
	printf("哈希表:\n"); 
	printf(" 哈希表地址:\t");
	for (i=0;i<m;i++) 
		printf(" %3d",i);
	printf(" \n");
    printf(" 哈希表关键字:\t");
	for (i=0;i<m;i++) 
		if (ha[i].key==NULLKEY)
			printf("    ");			//输出3个空格
		else
			printf(" %3d",ha[i].key);
	printf(" \n");
	printf(" 探测次数:\t");
	for (i=0;i<m;i++)
		if (ha[i].key==NULLKEY)
			printf("    ");			//输出3个空格
		else
			printf(" %3d",ha[i].count);
	printf(" \n");
	ASL(ha,n,m,p);
}
int main()
{
	system("color 00a");
	int s;
	int l;
	cout<<"输入你的关键字集合的长度"<<endl;
	cin>>l;
	int keys[l];
	cout<<"输入你的关键字"<<endl;
	for(int i=0;i<l;i++)
	{
		
		cin>>keys[i];
		//cout<<"请输入你的下一个关键字"<<endl;	
	}
	//int keys[]={16,74,60,43,54,90,46,31,29,88,77};
	int n,m=13,p=13,k;
	HashTable ha[MaxSize];
	cout<<"本程序为散列查找算法"<<endl;
	cout<<"输入【0】退出本程序"<<endl;
	cout<<"输入【1】创建哈希表"<<endl;
	cout<<"输入【2】显示哈希表"<<endl;
	cout<<"输入【3】查找"<<endl;
	cout<<"输入【4】删除某个元素"<<endl;
	cout<<"输入【5】插入某个元素"<<endl;
	cout<<"输入你要进行的操作"<<endl; 
	cin>>s;
	while(s!=0)
	{ 
		if(s==1)
	{
	CreateHT(ha,n,m,p,keys,l);
	//11为本哈希表长度,后来进行界面优化时可将其替换为n1 
	cout<<"哈希表创建完成"<<endl; 
	}
		else if(s==2)
	{	
		cout<<"哈希表为"<<endl; 
		DispHT(ha,n,m,p);
		
	}
		else if(s==3)
	{
		cout<<"请输入你要查找的值"<<endl;
		cin>>k; 
	SearchHT(ha,m,p,k);	
	}
		else if(s==4)
	{
//	k=31;
	cout<<"删除某个元素"<<endl;
	cin>>k;
	DeleteHT(ha,n,m,p,k);
	cout<<"删除成功"<<endl;
	}
		else if(s==5)
	{
	cout<<"输入你要插入的值"<<endl;
	cin>>k;	
	InsertHT(ha,n,m,p,k);
	cout<<"插入成功"<<endl; 
	}
	cout<<"请输入你的操作"<<endl;
	cout<<"本程序为哈夫曼查找算法"<<endl;
	cout<<"输入【0】退出本程序"<<endl;
	cout<<"输入【1】创建哈希表"<<endl;
	cout<<"输入【2】显示哈希表"<<endl;
	cout<<"输入【3】查找"<<endl;
	cout<<"输入【4】删除某个元素"<<endl; 
	cout<<"输入【5】插入某个元素"<<endl;
	cout<<"输入你要进行的操作"<<endl; 
	cin>>s; 
	}
	cout<<"程序退出"<<endl; 
}
//长度为:11 
//int keys[]={16,74,60,43,54,90,46,31,29,88,77};
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值