设有若干个学生的考试成绩,采用除留余数求哈希地址,将学生的信息存储到该地址空间,并且采用线性探测法解决冲突问题。
#include <iostream.h>
#include <conio.h>
#include <iomanip.h>
#include <string.h>
//---------------------------------------------------------------------------
typedef int KeyType; // 关键字的类型
const int MAXSIZE=100; // 数组的容量
struct ElemType //学生的记录信息
{ KeyType key ; //学号
char name[8]; //姓名
int english; //成绩
int math; //成绩
int dataStructure; //成绩
} ;
class SqHash
{ private:
ElemType *ht; // 哈希表数组
int length; // 哈希表容量
KeyType p; // 除留余数法的大质数
public:
SqHash( int n1,int p1);
~SqHash(){delete []ht;
length=0;};
int find( KeyType K );
void creat_hash();
void PrintOut();
};
//-------------------------------------------------------------
SqHash::SqHash(int n1,int p1)
{ length=n1;
p=p1;
ht=new ElemType[length];
for(int i=0;i<length;i++)ht[i].key=0;
}
void
SqHash::creat_hash()
{ int i,j,K,en,ma,da;char na[8];
cout<<"\n 请逐一输入各个学号(关键字值)(-1结束):"; cin>>K;
while(K!=-1)
{ i=find(K);
if(i==-32767) {
cout<<"\n 成功查找到,不再重复插入!";
cout<<"\n 请逐一输入各个学号(关键字值)(-1结束):";
cin>>K;
}
else
if(i!=32767){
cout<<"\n 请输入学生的姓名,英语成绩、高数成绩和数据结构成绩:";
cin>>na>>en>>ma>>da;
ht[i].key=K;
strcpy(ht[i].name,na); //用串拷贝赋值
ht[i].english=en;
ht[i].math=ma;
ht[i].dataStructure =da;
// 插入学生记录K
cout<<"\n 插入成功!" ;
cout<<"\n 请逐一输入各个学号(关键字值)(-1结束):";
cin>>K;
}
else {
cout<<"Hash表已满"<<endl;
break;
}
}
}
/将此成员函数补充完整,使得程序能够正确运行
int
SqHash::find( KeyType K )//查找函数
{
KeyType key ;
int
c; //冲突次数
int
i=K%p; //取元素的散列函数值
while
((c<MAXSIZE) &&(ht[i].key!=0 && ht[i].key!=K))//做while循环条件/当冲突次数小于散列表长度且查找位置有元素且不等于K,将i放入哈希地址
i=(i+1)%MAXSIZE;//这个就是做运算放入数的地址,解决冲突,遇到冲突次数加一
if(ht[i].key
== K)//如果输入的k所在的哈希地址等于k,则执行将学生的信息存储到该地址空间
{
cout<<"\n
i="<<i<<"学号是:"<<setw(3)<<ht[i].key
<<"姓名是:"<<setw(3)<<ht[i].name
<<"英语成绩是:"<<setw(3)<<ht[i].english
<<"高数成绩是:"<<setw(3)<<ht[i].math
<<"数据结构成绩是:"<<setw(3)<<ht[i].dataStructure
;
return
-32767;//上述插入函数定义
}
else
return
i;//查找成功
}
}
void
SqHash::PrintOut()
{ int i,j;
for (i=0;i<length; i++)
cout<<"\n
i="<<i<<" 学号:"<<setw(3)<<ht[i].key<<" 姓"<<setw(3)<<ht[i].name
<<" 英语成绩:"<<setw(3)<<ht[i].english<<" 高数成绩:"<<setw(3)<<ht[i].math <<"数据结构成绩:"<<setw(3)<<ht[i]. dataStructure;
}
int main()
{
int p0,n0;
cout<<"\n 请输入n值(n值应是记录总数的1.3-1.5倍)"; cin>>n0;
cout<<"\n 请输入P值(应是不大于n 的大质数):";
cin>>p0;
SqHash ha(n0,p0); ElemType a;
int k; char ch;
do { cout<<"\n\n\n";
cout<<"\n 1. 建立哈希表(开放地址法) ";
cout<<"\n 2. 在哈希表中查找某位学生 ";
cout<<"\n 3. 输出哈希表";
cout<<"\n 4. 结束";
cout<<"\n=======================================";
cout<<"\n 输入您的选择(1,2,3,4):"; cin>>k;
switch(k)
{ case 1:{ ha.creat_hash();
} break;
case 2:{ cout<<"\n 请输入待查找的学生学号:"; cin>>a.key;
int i=ha.find(a.key);
if(i!=-32767)
cout<<"\n 此学生"<<a.key<<" 不存在!" ;
} break;
case 3:{ ha.PrintOut(); } break;
}
}while(k>=1&&k<=3);
_getch(); return 0;
}