当前位置:文档之家› 哈希表实现号码查询实验报告

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

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"); }
(1)设每个记录有下列数据项:电话号码、用户名、地址;
(2)从键盘输入各记录 ,以电话号码为关键字建立哈希表(至少要有 12 个以上的
记录,哈希表的长度为 8);
(3)采用链地址法解决冲突;
(4)显示建立好的哈希表,对于学有余力的同学可以实现哈希表的查找。
2.实验说明:
(1)采用除留余数法进行哈希表的散列,即以电话号码作为主关键字,将电话号码
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)
第 页共 页
华北电力大学实验报告
{ key=key+(int)(nu[i]-'0');
} key=key%7; struct node *q=lis[key].lnext; struct node *p=new nod4;); else {
for(int i=1;;i++) {
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])
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)
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<11;i++) {
temp->next=p->lnext; p->lnext=temp;
4. 按电话号码查找记录。读入要查找的电话号码,计算得到哈希地址,在相应 的哈希地址中寻找匹配节点,若找到,则输出节点信息,否则,提示未找到 相关信息。
第 页共 页
华北电力大学实验报告
void find(char nu[]) //find the info of a node by num {
华北电力大学
实验报告
| |
实验名称
哈希表
课程名称
数据结构
| |
专业班级:
学生姓名:
学 号:
成 绩:
指导教师:
实验日期:
华北电力大学实验报告
一、实验目的 (1)掌握哈希表的基本操作。 (2)掌握插入、删除、查找等运算,能够灵活应用这种数据存储结构。 二、实验内容及要求
1.实验要求
设计哈希表实现电话号码查询系统。设计程序完成以下要求:
处理信息 : 1. 采用除留余数法进行哈希表的散列,即以电话号码为主关键字,将电话号码 的 11 位相加,按照模 7 取余; 2. 解决冲突用链地址法。
功能设计 : 1. 通过哈希表的构造存储电话号码的相关信息; 2. 能够遍历哈希表,显示所有数据; 3. 通过电话号码查找哈希表,显示与该电话号码有关的所有信息;
第 页共 页
华北电力大学实验报告
} 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
{ 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;
第 页共 页
华北电力大学实验报告
5. 邻接表的构造。 遇到的问题:
哈希地址的求取,以及冲突的解决。 解决方法:哈希地址以电话号码为关键字,将电话号码的 11 位相加,对 7 取模得到哈希 地址。 七、实验代码
#include<stdio.h> #include<string.h> #include<iostream.h> #define length 8 //length of list struct list //list {
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)
第 页共 页
华北电力大学实验报告
}
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) {
的 11 位相加,按照模 7 取余;
(2)解决冲突用链地址法。
3.实验数据:
(1)姓名:张三 电话号码:13362589630 地址:保定
(2)姓名:李四 电话号码:15936986542 地址:石家庄…… 三、 实验仪器与设备
计算机,记事本,visual C++6.0 四、问题分析与系统设计
相关主题