查找哈希表实现电话号码查询系统

手机电话号码查询  时间:2021-04-12  阅读:()

哈希表散列表的设计与实现

【问题描述】

设计哈希表实现电话号码查找系统。

【基本要求】

(1)设每个记录有下列数据项 电话号码、用户名、地址

(2)从键盘输入各记录分别以电话号码为关键字建立散列表

(3)采用拉链法解决冲突

(4)查找并显示给定电话号码的记录

(5)查找并显示给定用户名的记录。

【选做内容】

(1)系统功能的完善

(2)设计不同的散列函数 比较冲突率

(3)在散列函数确定的前提下尝试各种不同类型处理冲突的方法考察平均查找长度的变化。

地址嫌麻烦没加使用的时候要先新建一个空白的data.txt文件。

//hash.cpp:定义控制台应用程序的入口点。

//

#include"stdafx.h"

#include<stdio.h>

#include<iostream>using namespace std;

#define P 100

#define Z 97

#define MAX 100struct data{char name[15];//存放姓名long num;//存放电话号码

};typedef struct hashdata{char name[15];long num;hashdata*next;

}*linklist;data h[MAX];hashdata nhash[MAX];hashdata nahash[MAX];

unsigned int BKDRHash(char*str)//字符串哈希值生成函数{unsigned int seed=31; //31 131 1313 13131 131313 etc. .unsigned int hash=0;while(*str)

{hash=hash*seed+(*str++);

}return(hash&0x7FFFFFFF);

}unsigned int APHash(char*str)//字符串哈希值生成函数{unsigned int hash=0;int i;for(i=0; *str; i++)

{if((i&1)==0)

{hash^=((hash<<7)^(*str++)^(hash>>3));}else

{hash^=(~((hash<<11)^(*str++)^(hash>>5)));}

}return(hash&0x7FFFFFFF);

}int datanum(int j)//统计h[MAX]数组中有多少数据

{for(j=0;j<P&&h[j].num!=NULL;j++){}return j;

}void wdata()//新建电话簿数据文件

{for(int i=0;i<1;i++)

{s canf("%s%d",&h[i].name,&h[i].num);

}

FILE*fp;fp=fop en("data.txt","wb");fwrite(h,sizeof(struct data),1,fp);fclose(fp);

}void wpdata()//将h[MAX]的数据写入到文件当中{int j=datanum(j);

FILE*fp;fp=fop en("data.txt","wb");fwrite(h,sizeof(struct data),j,fp);fclose(fp);

}void adata()//在电话簿中添加数据并写入文件{for(int i=0;i<1;i++)

{s canf("%s%d",&h[i].name,&h[i].num);}

FILE*fp;fp=fop en("data.txt","ab");fwrite(h,sizeof(struct data),1,fp);fclose(fp);

}void rdata()//读取文件中的电话簿数据

{

FILE*fp;fp=fop en("data.txt","rb");fread(h,sizeof(struct data),P,fp);int j=datanum(j);printf("\n编号 姓 名 电 话\n\n");for(int i=0;i<j;i++)

{printf("%4d ",i+1);printf("%10 s%10 d\n",h[i].name,h[i].num);}fclose(fp);

}void ldata()//载入文件到h[MAX]数组当中

{

FILE*fp;fp=fop en("data.txt","rb");fread(h,sizeof(struct data),P,fp);

fclose(fp);

}void ddata(int n)//删除电话簿中数据

{if(n==0){return;}ldata();int j=datanum(j),i;for(i=n;i<j;i++)

{strcpy(h[i-1].name,h[i].name);h[i-1].num=h[i].num;

}h[j-1].num=NUL L;wpdata();

}void numhash(struct data s[MAX])//按电话号码生成哈希表{int k=0;int j=datanum(j);for(int i=0;i<j;i++)

{k=s[i].num%Z;i f(nha sh[k].num==NULL){strcpy(nha s h[k].name,s[i].name);nha sh[k].num=s[i].num;nhash[k].next=NULL;

}else{linklist p;p=(linklist)malloc(sizeof(hashdata));strcpy(p->name,s[i].name);p->num=s[i].num;p->next=nha sh[k].next;nhash[k].next=p;

}

}

}void fnumhash(long n)//按电话号码在哈希表中查找数据{int k=0;k=n%Z;linklist p;p=&nha s h[k];i f(p->num==n){printf("\n姓 名 电 话\n");

printf("%6 s%10d\n\n",p->name,p->num);}else{while(p!=NULL){i f(p->num==n){printf("\n姓 名 电 话\n");printf("%6 s%10d\n\n",p->name,p->num);break;}else{if(p->next==NULL){printf("\n该号码不存在 \n\n");}p=p->next;}

}

}

}void namehash(data s[MAX])//按姓名生成哈希表

{int k=0;int j=datanum(j);for(int i=0;i<j;i++)

{k=BKDRHash(s[i].name);k=k%Z;if(nahash[k].num==NULL){strcpy(naha sh[k].name,s[i].name);naha sh[k].num=s[i].num;nahash[k].next=NULL;

}else{linklist p;p=(linklist)malloc(sizeof(hashdata));strcpy(p->name,s[i].name);p->num=s[i].num;p->next=nahash[k].next;nahash[k].next=p;

}

}

}void fnamehash(char str[3])//按姓名在哈希表中查找数据{int k=0;k=BKDRHash(str);k=k%Z;linklist p;p=&nahash[k];if(APHash(str)==APHash(nahash[k].name)){

printf("\n姓 名 电 话\n");printf("%6 s%10 d\n\n",p->name,p->num);}else{while(p!=NULL){if(APHash(str)==APHash(p->name)){printf("\n姓 名 电 话\n");printf("%6 s%10d\n\n",p->name,p->num);break;}else{if(p->next==NULL){printf("\n该姓名不存在 \n\n");}p=p->next;

}

}

}

}void rnumhash()//输出按电话号码生成的哈希表

{printf("\n编号 姓 名 电 话\n\n");for(int i=0;i<MAX;i++)

{i f(nha sh[i].num!=NULL){if(nhash[i].next!=NULL){printf("%4d",i);printf("%10 s%10 d",nha s h[i].name,nha sh[i].num);linklist p;p=&nha sh[i];p=p->next;while(p!=NULL){printf(" ->%10 s%10d",p->name,p->num);p=p->next;

}printf("\n");

}else{printf("%4d",i);printf("%10 s%10 d\n",nhash[i].name,nhash[i].num);

}}else{printf("%4d",i);printf("\n");

}

}

}

void rnamehash()//生成按姓名生成的哈希表

{printf("\n编号 姓 名 电 话\n\n");for(int i=0;i<MAX;i++)

{i f(naha s h[i].num!=NULL){if(nahash[i].next!=NULL){printf("%4d",i);printf("%10 s%10d",nahash[i].name,nahash[i].num);linklist p;p=&nahash[i];p=p->next;while(p!=NULL){printf(" ->%10 s%10d",p->name,p->num);p=p->next;

}printf("\n");

}else{printf("%4d",i);printf("%10 s%10 d\n",nahash[i].name,nahash[i].num);

}}else{printf("%4d",i);printf("\n");

}

}

}int_tmain(int argc,_TCHAR*argv[])

{int m;ldata();numhash(h);namehash(h);

<"*******************************电 话 号 码 查 询 系 统

*******************************"<<printf("\t\t\t\t 1.电话簿\n\t\t\t\t2.按电话查找\n\t\t\t\t3.按姓名查找\n\t\t\t\t4.显示哈希表\n\t\t\t\t0.退出\n\n");cout<<"********************************************************************

**********"<<endl;while((scanf("%d",&m))&&m!=0){switch(m)

{case 1:

int n;printf("\n 1.新建\n2.添加\n3.显示\n4.删除\n0.退出\n");while((scanf("%d",&n))&&n!=0){switch(n)

{case 1:printf("\n姓 名 电 话\n");wdata();break;case 2:printf("\n姓 名 电 话\n");adata();break;case 3:rdata();break;case 4:int n;rdata();printf("\n请输入编号(0.退出删除):");s canf("%d",&n);ddata(n);break;

}printf("\n 1.新建\n2.添加\n3.显示\n4.删除\n0.退出\n");

}break;case 2:int num;

//rnumha s h();

//ldata();

//numha s h(h);printf("请输入一个电话号码:");s c anf("%d",&num);fnumh a s h(num);break;case 3:char name[3];

//rnamehas h();

//ldata();

//namehash(h);printf("请输入一个姓名:");s canf("%s",name);fnamehash(name);break;case 4:int m;printf("1.按号码显示\n2.按姓名显示\n");s canf("%d",&m);if(m==1){rnumh a s h();}else

{rnamehash();}break;de fault:break;

}

<"*******************************电 话 号 码 查 询 系 统

*******************************"<<printf("\t\t\t\t 1.电话簿\n\t\t\t\t2.按电话查找\n\t\t\t\t3.按姓名查找\n\t\t\t\t4.显示哈希表\n\t\t\t\t0.退出\n\n");cout<<"********************************************************************

**********"<<endl;

}return 0;

}

Friendhosting 黑色星期五 VDS/VPS可享四五折优惠促销

Friendhosting商家在前面的篇幅中也又陆续介绍到,是一家保加利亚主机商,主要提供销售VPS和独立服务器出租业务,数据中心分布在:荷兰、保加利亚、立陶宛、捷克、乌克兰和美国洛杉矶等。这不近期黑色星期五活动,商家也有推出了黑五优惠,VPS全场一次性45折,虚拟主机4折,全球多机房可选,老用户续费可获9折加送1个月使用时长,VDS折后最低仅€14.53/年,有需要的可以看看。Friendhos...

racknerd:美国大硬盘服务器,$599/月,Ryzen7-3700X/32G内存/120gSSD+192T hdd

racknerd当前对美国犹他州数据中心的大硬盘服务器(存储服务器)进行低价促销,价格跌破眼镜啊。提供AMD和Intel两个选择,默认32G内存,120G SSD系统盘,12个16T HDD做数据盘,接入1Gbps带宽,每个月默认给100T流量,5个IPv4... 官方网站:https://www.racknerd.com 加密数字货币、信用卡、PayPal、支付宝、银联(卡),可以付款! ...

瓜云互联-美国洛杉矶高防CN2高防云服务器,新老用户均可9折促销!低至32.4元/月!

瓜云互联一直主打超高性价比的海外vps产品,主要以美国cn2、香港cn2线路为主,100M以内高宽带,非常适合个人使用、企业等等!安全防护体系 弹性灵活,能为提供简单、 高效、智能、快速、低成本的云防护,帮助个人、企业从实现网络攻击防御,同时也承诺产品24H支持退换,不喜欢可以找客服退现,诚信自由交易!官方网站:点击访问瓜云互联官网活动方案:打折优惠策略:新老用户购买服务器统统9折优惠预存返款活动...

手机电话号码查询为你推荐
支持ipad新闻联播网易yeah搜狗360没有登录过搜狗浏览器,只是用搜狗高速浏览器等QQ淘宝会有事情么asp.net空间谁知道免费的ASP空间波音737起飞爆胎为什么很少见到飞机轮胎爆胎?重庆网站制作重庆网站制作,哪家公司服务,价格都比较好?360arp防火墙在哪360ARP防火墙flashfxp注册码谁有~FLASHfxp V3.0.2的注册码~~谢谢哦!!要现在能用的!!!!面板flashJoinsql
mysql虚拟主机 vps推荐 提供香港vps 域名交易网 pccw 博客主机 国外服务器 linkcloud 域名优惠码 美国php空间 京东商城双十一活动 有奖调查 gtt 卡巴斯基免费试用版 raid10 360云服务 登陆空间 空间登入 视频服务器是什么 上海电信测速 更多