基于散列表的电话号码查询系统 完整版
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#include
#include
#include
#define MAXSIZE 100 //电话薄记录的数量
#define MAX_SIZE 50 //用户名、电话号码、地址的最大长度
#define HASHSIZE 400 //定义表长
#define SUCCESS 1 //查找
#define UNSUCCESS -1
#define LEN sizeof(HashTable) // 哈希表的长度
using namespace std;
typedef int Status;//typedef用来定义类型的别名。此处用status作为int别名,目的表达int 变量是一个状态变量。
typedef char NA[MAX_SIZE]; //NA作为char的别名
typedef struct{ // 自定义一个记录用户名、电话号码、联系地址的结构体的别名record
NA name,tel,add,way;
}Record;
Record a[HASHSIZE];
typedef struct{ //散列表
Record *elem[HASHSIZE]; //数据元素存储地址
int count; //数据元素个数
int size; //容量
}HashTable;
Status eq(NA x,NA y)
{ //关键字比较,相等返回SUCCESS;否则返回UNSUCCESS
if(strcmp(x,y)==0)//2个字符串的大小比较s1=s2,strcmp(s1,s2) == 0; s1>s2, strcmp(s1,s2) == 1; s1 return SUCCESS; else return UNSUCCESS; } Status NUM_BER; //记录的个数 void getin(Record* a){ // 键盘输入联系人的信息,Record*调用Record函数;a是参数 cout<<"请输入要添加的联系人的个数:\n"; cin>>NUM_BER; int i; for(i=0;i cout<<"请输入第"< cin>>a[i].name; cout<<"请输入第"< cin>>a[i].tel; cout<<"请输入第"< cin>>a[i].add; }} void ShowInformation(Record* a)//显示输入的用户信息 { int i; for( i=0;i cout<<"\n第"< } long fold(NA s) //人名的折叠处理:将关键字分割成位数相同的几部分,最后一部分位数可以不同,然后取这几部分的叠加和(去除进位)作为散列地址 { char *p; long sum=0; NA ss; strcpy(ss,s);//复制字符串,不改变原字符串的大小写 strupr(ss);//将字符串ss转换为大写形式 p=ss; while(*p!='\0') sum+=*p++; return sum; } int Hash1(NA str){//哈希函数 long n; int m; n=fold(str);//先将用户名进行折叠处理 m=n%HASHSIZE; //折叠处理后的数,用除留余数法构造哈希函数 return m; //并返回模值 } int Hash2(NA str){//哈希函数 long n; int m; n = atoi(str);//把字符串转换成整型数. m=n%HASHSIZE; //用除留余数法构造哈希函数 return m; //并返回模值 } 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; if(q>=0) return q; else i=c/2+1; } else{ q=(p-i*i)%HASHSIZE; c++; if(q>=0) return q; else i=c/2+1; } } return UNSUCCESS; } int searchHash( HashTable * &H, NA key, int &p, int &c ,int way ) { if( way == 1 ){ p=Hash1( key ); while(H->elem[p]!=NULL && !eq( key, H->elem[p]->name ) )//若哈希地址冲突,进行冲突处理 collision( p ,++c ); if( eq( key, H->elem[p]->name ) ) return 1; else return 0; } else { p=Hash2( key ); while(H->elem[p]!=NULL && !eq( key, H->elem[p]->tel ) )//若哈希地址冲突,进行冲突处理