散列法的实验研究
【问题描述】
基本要求:设每个记录有下列数据项:电话号码、用户名、地址;从键盘输入各记录,分别以电话号码和用户名为关键字建立散列表;采用一定的方法解决冲突;查找并显示给定电话号码的记录;查找并显示给定用户名的记录。
进一步完成内容:
系统功能的完善:
设计不同的散列函数,比较冲突率;
在散列函数确定的前提下,尝试各种不同类型处理冲突的方法,考察平均查找长度的变化。
#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
#define MAXSIZE 20
#define HASHSIZE 50 //定义表长
#define SUCCESS 1
#define UNSUCCESS -1
#include<iostream>
typedef int Status;
int num1 = 0; //记录的个数
int num2 = 0;
//记录
typedef struct{
char name[MAXSIZE]; //姓名
char address[MAXSIZE]; //地址
char tel[MAXSIZE]; //电话号码
}DataType;
//HashTable1:以电话号码为关键字
typedef struct{
DataType *elem1[HASHSIZE]; //数据元素存储基址
int count1; //当前数据元素个数
int size1; //当前容量
}HashTable1;
//HashTable2:以姓名为关键字
typedef struct{
DataType *elem2[HASHSIZE]; //数据元素存储基址
int count2; //当前数据元素个数
int size2; //当前容量
}Hashtable2;
//比较两个数组是否相等,若相等返回1,否则返回-1
Status Compare(char a1[MAXSIZE], char a2[MAXSIZE]){
if(strcmp(a1, a2) == 0) return 1;
else return -1;
}
//遍历用户的信息
void ShowData(DataType *d){
system("cls");
cout << "姓名\t地址\t电话号码" << endl;
for(int i = 0; i < num1 + num2; i++){
if(!d[i].name[0] == '\0') //姓名非空时
cout<< d[i].name << "\t" << d[i].address << "\t" << d[i].tel << endl;
}
system("pause");
system("cls");
}
//一次探测
int Hash1(char name[MAXSIZE]){
int i = 0, p;
p = (int)name[0];
while(name[i] != '\0')
{
p += (int)name[i];
i++;
}
p = p % HASHSIZE;
return p;
}
int Hash2(char tel[MAXSIZE]){
int i, p = 0;
while(i != MAXSIZE){
p += (tel[i] - '0');
i++;
}
p = p % HASHSIZE;
return p;
}
//冲突处理函数
Status CollisionSolution(int p, int c){
int i, q;
i = c / 2 + 1;
while(i < HASHSIZE){
if(c % 2 == 0){
c++;
q = (p + i * i) % HASHSIZE;//倘若c为偶数,函数公式为:(余数+i*i)%表长,返回合理值
if(q >= 0) return q;
else i = c / 2 + 1;
}
else{
q = (p - i * i) % HASHSIZE;//若c为奇数,函数公式为:(余数-i*i)%表长,返回合理值
c++;
if(q >= 0) retur