这。。。是我的数据结构课程设计
题目要求是这个样子的。。。
设计散列表(哈希表)实现电话号码查找系统。
基本要求:
1) 设每个记录有下列数据项:电话号码、用户名、地址等相关信息;
2) 从键盘输入各记录,分别以电话号码和用户名为关键字建立散列表;
3) 采用一定的方法解决冲突;
4) 查找并显示给定电话号码的记录;
5) 查找并显示给定用户名的记录。
6) 允许对记录进行相关的增加,修改,删除,。
扩展要求:
1) 系统功能的完善;
2) 设计不同的散列函数,比较冲突率;
3) 在散列函数确定的前提下,尝试各种不同类型处理冲突的方法,考察平均查找长度的变化。
其实。。。
我到现在也没有弄明白为什么要分别以电话号码和用户名来建立哈希表呢。。。
搞不明白。。。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 20
#define MAX_SIZE 20 //人名的最大长度
#define HASHSIZE 60 //定义表长
#define SUCCESS 1
#define UNSUCCESS -1
#include<iostream>
using namespace std;
typedef int Status; //为现有类型添加一个同义字
typedef char NA[MAX_SIZE];// typedef 掩饰数组类型
typedef struct//记录
{
NA name;
NA address; //关键字
NA tel;
}humen; //查找表中记录类型
typedef struct //建立哈希表
{
humen *elem[HASHSIZE];//数据元素存储基址
int cou; //当前数据元素个数
int siz; //当前容量
}HashTable;
typedef struct //建立哈希表
{
humen *elema[HASHSIZE];//数据元素存储基址
int cou2; //当前数据元素个数
int siz2; //当前容量
}Hashtable;
Status eq(char x[MAX_SIZE],char y[MAX_SIZE]) //比较两个数组是否相等,若相等返回1,否则返回-1
{
if(strcmp(x,y)==0)
return 1;
else return -1;
}
Status NUM_BER; //记录的个数 全局变量
Status NUM_BER1; //记录的个数 全局变量
void output(humen* a) //遍历用户的信息
{
int i;
system("cls");
printf("姓名\t地址\t电话号码");
for( i=0;i<NUM_BER+NUM_BER1;i++)
{
if(!a[i].name[0]=='\0')
printf("\n%s\t%s\t\t%s",a[i].name,a[i].address,a[i].tel);
}
cout<<endl;
system("pause");
system("CLS");
}
int Hash(char name[MAX_SIZE])//将输入的字符数组转换成ASCII码后相加求和,然后取表长余数,并将余数值返回//一次探测
{
int i,m;
i = 1;
m=(int)name[0]; //强制转化成数字
while(name[i]!='\0')
{
m+=(int)name[i];//余数
i++;
}
m=m%HASHSIZE;
return m;
}
int Hash2(char num[MAXSIZE])
{
int i=0,key=0;
while(i!=MAXSIZE)//关键字
{
key+=(num[i]-'0');//关键字求和
i++;
}
key=key%HASHSIZE;
return key;
}
Status collision(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) return q;
else i=c/2+1;
}
}
return UNSUCCESS;
}
void CreateHash(