哈希表实现号码查询实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
struct node *lnext;//point a record }lis[length]; struct node //record node {
char name[8], address[20]; char num[11]; struct node *next; }; int hash(struct node record) //get key by num { int key=0; for(int i=0;i<1来自百度文库;i++) {
a=0; continue; } else { a=1; break; } } if(a==0) { printf("Key:%d\n",key); printf("姓名:%s\t 地址:%s\t 电话:%s\n",q->name,q->address,q->num); break;
第 页共 页
华北电力大学实验报告
第 页共 页
华北电力大学实验报告
} else {
p=q; q=q->next; } if(q==NULL) break; } if(a==1) printf("信息不存在\n"); } } void menu() //choose operation { printf("1.添加记录\n"); printf("2.查找记录\n"); printf("3.号码显示\n"); printf("4.号码删除\n"); printf("5.退出系统\n"); } void main() { struct list lis[length]; for (int i=0;i<length;i++) { lis[i].lnext=NULL; } int sel;//select for operation while(1) { menu(); scanf("%d",&sel); if(sel==1) //add node { createnode(); } if(sel==2) //find info { char numb[11]; printf("请输入电话号码:\n"); scanf("%s",numb); printf("输出查找的信息:\n"); find(numb); } if(sel==3) //show list
printf("无此记录\n"); else {
for(int i=1;;i++) {
for(int j=0;j<11;j++) {
if(nu[j]==q->num[j]) {
a=0; continue; } else { a=1; break; } } if(a==0) { if(i==1) lis[key].lnext=q->next; p->next=q->next; q=NULL; delete q; printf("节点已删除\n"); break;
temp->next=p->lnext; p->lnext=temp;
4. 按电话号码查找记录。读入要查找的电话号码,计算得到哈希地址,在相应 的哈希地址中寻找匹配节点,若找到,则输出节点信息,否则,提示未找到 相关信息。
第 页共 页
华北电力大学实验报告
void find(char nu[]) //find the info of a node by num {
3. 插入电话记录。
void createnode() //create or add a new node {
struct node *temp= new node; temp->next=NULL; printf("请输入姓名:\n"); scanf("%s",temp->name); printf("输入电话:\n"); scanf("%s",temp->num); printf("输入地址: \n"); scanf("%s",temp->address); int k=hash(*temp); struct list *p=&lis[k]; if(p->lnext!=NULL)
printf("%s\t%s\t%s\n",q->name,q->address,q->num); q=q->next; } } }
五、实验结果 输入电话号码信息,将电话记录存入电话号码查询系统中。然后进行号码查找,删
除和显示,结果如下:
第 页共 页
华北电力大学实验报告
六、总结与体会 运用到的知识: 1. 哈希表的构造; 2. 哈 希表 的 散 列 ; 3. 哈希表的冲突处理方法; 4. 哈希表的查找;
int key=0,a=1;
for(int i=0;i<11;i++)
{
key=key+(int)(nu[i]-'0'); }
key=key%7;
struct node *q=lis[key].lnext;
while(q!= NULL)
{ for(int i=0;i<11;i++)
{
if(nu[i]==q->num[i])
(1)设每个记录有下列数据项:电话号码、用户名、地址;
(2)从键盘输入各记录 ,以电话号码为关键字建立哈希表(至少要有 12 个以上的
记录,哈希表的长度为 8);
(3)采用链地址法解决冲突;
(4)显示建立好的哈希表,对于学有余力的同学可以实现哈希表的查找。
2.实验说明:
(1)采用除留余数法进行哈希表的散列,即以电话号码作为主关键字,将电话号码
key=key+(int)(record.num[i]-'0'); } key=key%7; return key; } void createnode() //create or add a new node { struct node *temp= new node; temp->next=NULL; printf("请输入姓名:\n"); scanf("%s",temp->name); printf("输入电话:\n"); scanf("%s",temp->num); printf("输入地址: \n"); scanf("%s",temp->address); int k=hash(*temp); struct list *p=&lis[k]; if(p->lnext!=NULL)
通过姓名查找哈希表,显示与该姓名有关的所有信息; 算法设计: 采用除留余数法进行哈希表的散列,解决冲突用链地址法。
第 页共 页
华北电力大学实验报告
1. 定义哈希表节点的结构体,包括数据域和指针域。
#define length 8 //length of list struct list //list { struct node *lnext;//point a record }lis[length]; struct node //record node { char name[8], address[20]; char num[11]; struct node *next; };
printf("no record now\n"); while(q) {
printf("%s\t%s\t%s\n",q->name,q->address,q->num); q=q->next; } } } void find(char nu[]) //find the info of a node by num { int key=0,a=1; for(int i=0;i<11;i++) { key=key+(int)(nu[i]-'0'); } key=key%7; struct node *q=lis[key].lnext; while(q!= NULL) { for(int i=0;i<11;i++) { if(nu[i]==q->num[i]) {
第 页共 页
华北电力大学实验报告
5. 邻接表的构造。 遇到的问题:
哈希地址的求取,以及冲突的解决。 解决方法:哈希地址以电话号码为关键字,将电话号码的 11 位相加,对 7 取模得到哈希 地址。 七、实验代码
#include<stdio.h> #include<string.h> #include<iostream.h> #define length 8 //length of list struct list //list {
华北电力大学
实验报告
| |
实验名称
哈希表
课程名称
数据结构
| |
专业班级:
学生姓名:
学 号:
成 绩:
指导教师:
实验日期:
华北电力大学实验报告
一、实验目的 (1)掌握哈希表的基本操作。 (2)掌握插入、删除、查找等运算,能够灵活应用这种数据存储结构。 二、实验内容及要求
1.实验要求
设计哈希表实现电话号码查询系统。设计程序完成以下要求:
处理信息 : 1. 采用除留余数法进行哈希表的散列,即以电话号码为主关键字,将电话号码 的 11 位相加,按照模 7 取余; 2. 解决冲突用链地址法。
功能设计 : 1. 通过哈希表的构造存储电话号码的相关信息; 2. 能够遍历哈希表,显示所有数据; 3. 通过电话号码查找哈希表,显示与该电话号码有关的所有信息;
} else
q=q->next; } if(a==1)
printf("无此记录\n"); } void deletenode(char nu[]) {
int key=0,a=1; for(int i=0;i<11;i++) {
key=key+(int)(nu[i]-'0'); } key=key%7; struct node *q=lis[key].lnext; struct node *p=new node; if(q==NULL)
temp->next=p->lnext; p->lnext=temp;
第 页共 页
华北电力大学实验报告
} void showlist() //show list {
for(int i=0;i<length;i++) {
struct node *q=lis[i].lnext; printf("Key:%d\n",i); if(!q)
for(int j=0;j<11;j++) {
if(nu[j]==q->num[j]) {
a=0; continue; } else { a=1; break; } } if(a==0) { if(i==1) lis[key].lnext=q->next; p->next=q->next; q=NULL; delete q; printf("节点已删除\n"); break; } else { p=q; q=q->next; } if(q==NULL) break; } if(a==1) printf("信息不存在\n"); }
}
if(a==1) printf("无此记录\n");
}
// 的信息,则提示用户。
}
5. 按电话号码删除记录。读入要删除的电话号码,计算得到哈希地址,在相应
的哈希地址中寻找匹配节点,若找到,则删除节点信息,否则,提示未找到
相关信息。
void deletenode(char nu[])
{
int key=0,a=1; for(int i=0;i<11;i++)
{ a=0; continue;
}
else
{ a=1; break;
}
}
if(a==0) {
printf("Key:%d\n",key);
printf("姓名:%s\t 地址:%s\t 电话:%s\n",q->name,q->address,q->num);
break;
} else
q=q->next;
第 页共 页
华北电力大学实验报告
}
6. 输出所有的信息。
void showlist() //show list {
for(int i=0;i<length;i++) {
struct node *q=lis[i].lnext; printf("Key:%d\n",i); if(!q)
printf("no record now\n"); while(q) {
第 页共 页
华北电力大学实验报告
{ key=key+(int)(nu[i]-'0');
} key=key%7; struct node *q=lis[key].lnext; struct node *p=new node; if(q==NULL)
printf("无此记录\n"); else {
for(int i=1;;i++) {
2. 以电话号码为关键字,用除留余数法进行哈希表的散列,对 7 取模获得哈希 地址。
int hash(struct node record) //get key by num {
int key=0; for(int i=0;i<11;i++) {
key=key+(int)(record.num[i]-'0'); } key=key%7; return key; }
的 11 位相加,按照模 7 取余;
(2)解决冲突用链地址法。
3.实验数据:
(1)姓名:张三 电话号码:13362589630 地址:保定
(2)姓名:李四 电话号码:15936986542 地址:石家庄…… 三、 实验仪器与设备
计算机,记事本,visual C++6.0 四、问题分析与系统设计
系统描述:设计哈希表实现电话号码查询系统。其中,电话号码的每个记录有三个 数据项:电话号码、用户名和地址;以电话号码为关键字建立哈希表;假定哈希表的长 度为 8,采用链地址法解决冲突。
相关文档
最新文档