哈希表实现电话号码查询系统_第1页
哈希表实现电话号码查询系统_第2页
哈希表实现电话号码查询系统_第3页
哈希表实现电话号码查询系统_第4页
哈希表实现电话号码查询系统_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、哈希表(散列表)的设计与实现【问题描述】 设计哈希表实现电话号码查找系统。【基本要求】 (1) 设每个记录有下列数据项:电话号码、用户名、地址; (2) 从键盘输入各记录,分别以电话号码为关键字建立散列表; (3)采用拉链法解决冲突; (4)查找并显示给定电话号码的记录; (5) 查找并显示给定用户名的记录。【选做内容】 (1)系统功能的完善; (2)设计不同的散列函数,比较冲突率; (3)在散列函数确定的前提下,尝试各种不同类型处理冲突的方法,考察平均查找长度的变化。地址嫌麻烦没加,使用的时候要先新建一个空白的data.txt文件。/ hash.cpp : 定义控制台应用程序的入口点。/#i

2、nclude stdafx.h#include#includeusing namespace std;#define p 100#define z 97#define max 100struct datachar name15;/存放姓名long num;/存放电话号码;typedef struct hashdatachar name15;long num;hashdata *next;*linklist;data hmax;hashdata nhashmax;hashdata nahashmax;unsigned int bkdrhash(char *str)/字符串哈希值生成函数 unsi

3、gned 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 3); else hash = (hash 5); return (

4、hash & 0x7fffffff);int datanum(int j)/统计hmax数组中有多少数据for(j=0;jp&hj.num!=null;j+)return j;void wdata()/新建电话簿数据文件for(int i=0;i1;i+)scanf(%s%d,&,&hi.num);file *fp;fp=fopen(data.txt,wb);fwrite(h,sizeof(struct data),1,fp);fclose(fp);void wpdata()/将hmax的数据写入到文件当中int j=datanum(j);file *fp;fp=fopen(da

5、ta.txt,wb);fwrite(h,sizeof(struct data),j,fp);fclose(fp);void adata()/在电话簿中添加数据并写入文件for(int i=0;i1;i+)scanf(%s%d,&,&hi.num);file *fp;fp=fopen(data.txt,ab);fwrite(h,sizeof(struct data),1,fp);fclose(fp);void rdata()/读取文件中的电话簿数据file *fp;fp=fopen(data.txt,rb);fread(h,sizeof(struct data),p,fp);int

6、 j=datanum(j);printf(n编号 姓 名 电 话nn);for(int i=0;ij;i+)printf(%4d ,i+1);printf(%10s %10dn,,hi.num);fclose(fp);void ldata()/载入文件到hmax数组当中file *fp;fp=fopen(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;ij;i+)s

7、trcpy(,);hi-1.num=hi.num;hj-1.num=null;wpdata();void numhash(struct data smax)/按电话号码生成哈希表int k=0;int j=datanum(j);for(int i=0;iname,);p-num=si.num;p-next=nhashk.next;nhashk.next=p;void fnumhash(long n)/按电话号码在哈希表中查找数据int k=0;k=n%z;linklist p;p=&nhashk;if(p-num=n) printf(n姓 名 电

8、话n);printf(%6s %10dnn,p-name,p-num);elsewhile(p!=null)if(p-num=n)printf(n姓 名 电 话n);printf(%6s %10dnn,p-name,p-num);break;elseif(p-next=null)printf(n该号码不存在!nn);p=p-next;void namehash(data smax)/按姓名生成哈希表int k=0;int j=datanum(j);for(int i=0;iname,);p-num=si.num;p-next=nahashk.next;nahashk.next=p

9、;void fnamehash(char str3)/按姓名在哈希表中查找数据int k=0;k=bkdrhash(str);k=k%z;linklist p;p=&nahashk;if(aphash(str)=aphash() printf(n姓 名 电 话n);printf(%6s %10dnn,p-name,p-num);elsewhile(p!=null)if(aphash(str)=aphash(p-name)printf(n姓 名 电 话n);printf(%6s %10dnn,p-name,p-num);break;elseif(p-next=null)p

10、rintf(n该姓名不存在!nn);p=p-next;void rnumhash()/输出按电话号码生成的哈希表printf(n编号 姓 名 电 话nn);for(int i=0;inext;while(p!=null)printf( -%10s %10d,p-name,p-num);p=p-next;printf(n);elseprintf(%4d,i);printf(%10s %10dn,,nhashi.num);elseprintf(%4d,i);printf(n);void rnamehash()/生成按姓名生成的哈希表printf(n编号 姓 名 电 话nn);

11、for(int i=0;inext;while(p!=null)printf( -%10s %10d,p-name,p-num);p=p-next;printf(n);elseprintf(%4d,i);printf(%10s %10dn,,nahashi.num);elseprintf(%4d,i);printf(n);int _tmain(int argc, _tchar* argv)int m;ldata();numhash(h);namehash(h);cout*电话号码查询系统*endlendl;printf(tttt1.电 话 簿ntttt2.按电话查找nt

12、ttt3.按姓名查找ntttt4.显示哈希表ntttt0.退 出nn);cout*endl;while(scanf(%d,&m)&m!=0)switch(m)case 1:int n;printf(n1.新 建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请输入编号

13、(0.退出删除):);scanf(%d,&n);ddata(n);break;printf(n1.新 建n2.添 加n3.显 示n4.删 除n0.退 出n);break;case 2:int num;/rnumhash();/ldata();/numhash(h);printf(请输入一个电话号码:);scanf(%d,&num);fnumhash(num);break;case 3:char name3;/rnamehash();/ldata();/namehash(h);printf(请输入一个姓名:);scanf(%s,name);fnamehash(name);break;case 4:int

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论