#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<iostream>
#include<conio.h>
#include <iomanip.h>//引入iomanip以便能够使用cout,cin等函数
#define keyArrSize 11//关键字数组的长度
#define NULLKEY -1//表示数组中没有数据,可存放数据的标识
typedef struct {
int length;//哈希表的长度
int *address;//哈希表中存储数组地址
int *key;//关键字数组存储地址
int p;//为除数,p<=length
}HT;
void init(HT &a,int len,int p){//对哈希表进行初始化
a.length=len;
a.p=p;
a.address=new int[a.length];
a.key=new int[keyArrSize];
int i;
for(i=0;i<a.length;i++){
a.address[i]=NULLKEY;
}
for(i=0;i<keyArrSize;i++){
a.key[i]=NULLKEY;
}
}
//创建关键字数组
void CreateKeyArr(HT &a){
/* srand((unsigned int)time(NULL));
int i;
for(i=0;i<keyArrSize;i++){
a.key[i]=rand()%100+1;//生产1-100的数到关键字数组中
}
*/ int i;
int b[]={16,46,32,40,70,27,42,36,24,49,64};
for(i=0;i<keyArrSize;i++){
a.key[i]=b[i];//生产1-100的数到关键字数组中
}
}
//核心代码 创建哈希表
void createHT(HT &a){
int i,t;
for(i=0;i<keyArrSize;i++){
t=*(a.key+i)%a.p;
while(a.address[t]>=0){//如果哈希表中的元素大于或等于0,则表示数组元素冲突
t++;
t=t%a.length;
}
//冲突结束,将数据存入表中
a.address[t]=a.key[i];
}
}
//显示哈希表中的数据
void out(HT a) //输出哈希表
{ int k=0; //double s=0.0;
system("cls"); cout<<"关键字值:";
for(k=0;k<keyArrSize;k++) cout<<setw(5)<<a.key[k]; // 输出关键字序列(元素值)
cout<<endl<<endl;
cout<<"哈希函数:";
cout<<" H(key)= key % "<< a.p<<" " ; // 输出哈希函数(公式)本身
cout<<" 哈希表长度:"<< a.length <<endl; // 输出哈希表的总容量(大小)
cout<<"序号值:";
for(k=0;k<a.length;k++) cout<<setw(5)<<k; // 输出哈希表各元素的序号
cout<<endl;
cout<<"关键字:";
for(k=0;k<a.length;k++) cout<<setw(5)<<a.address[k]; // 输出哈希表元素的数据(关键字的地址值)
// 输出哈希表元素的数据
cout<<endl;
}
void main(){
HT ht;
init(ht,15,13);
CreateKeyArr(ht);
out(ht);
createHT(ht);
out(ht);
}
制作不易,还请大家多多打赏,谢谢