文章目录
头文件
#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;
}
}
}
运行结果