哈希表数据结构课设.docx
- 文档编号:660728
- 上传时间:2022-10-11
- 格式:DOCX
- 页数:21
- 大小:85.63KB
哈希表数据结构课设.docx
《哈希表数据结构课设.docx》由会员分享,可在线阅读,更多相关《哈希表数据结构课设.docx(21页珍藏版)》请在冰豆网上搜索。
哈希表数据结构课设
洛阳理工学院
课程设计说明书
课程名称数据结构
设计课题哈希表的设计与实现
专业
班级
学号
姓名
完成日期2
课程设计任务书
设计题目:
哈希表的设计与实现
设计内容与要求:
设计哈希表实现电话号码查询系统。
[基本要求]
1、设每个记录有下列数据项:
电话号码、用户名、地址;
2、从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表;
3、采用再哈希法解决冲突;
4、查找并显示给定电话号码的记录;
5、查找并显示给定用户名的记录。
6、在哈希函数确定的前提下,考察平均查找长度的变化。
指导教师:
2014年
课程设计评语
成绩:
指导教师:
年月日
【问题描述】
如何设计一个结构体数组使该数组中每个元素包含电话号码、用户名、地址。
如何分别以电话号码和用户名为关键字建立哈希表。
如何利用线性探测再散列法解决冲突。
如何实现用哈希法查找并显示给定电话号码的记录。
如何查找并显示给定用户的记录。
手工计算查找不成功的平均查找长度。
【基本要求】
设计哈希表实现电话号码查询系统。
设计程序完成以下要求:
(1)、设每个记录有下列数据项:
电话号码、用户名、地址;
(2)、从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表;(3)、采用再哈希法解决冲突
(4)、查找并显示给定电话号码的记录;
(5)、查找并显示给定用户的记录。
(6)、在哈希函数确定的前提下,考察平均查找长度的变化。
【测试数据】
1.用户名:
weiguo,号码:
123,地址:
gansu
2.用户名:
zhangkui,号码:
321,地址:
shanxi
【算法思想】
进入主函数,
用户输入1:
输入哈希表元素,
然后再选择2或者3按照用户名或者电话号码散列,在这下面又有分支语句选择解决冲突的办法,用线性探测再散列还是再哈希法。
生成哈希表之后,选择查找操作3分别以用户名和电话号码为关键字进行查找。
最后,输出查找不成功的平均查找长度。
在本程序当中用了两种解决冲突的办法,分别是线性探测再散列和再哈希法。
哈希函数构造方法是,除留余数法。
具体流程图1所示:
图1具体流程图
【模块划分】
本程序在菜单选项下包含六个子模块,如图2所示
图2模块划分
【数据结构】
本设计涉及到的数据结构为:
哈希表。
要求输入电话号码、用户名、地址三个信息,并要求分别以电话号码和用户名为关键字进行查找,所以本问题要用到两个哈希函数,进行哈希查找。
/*哈希表结构体*/
typedefstruct
{
charname[20];//用户名
charphone[20];//电话
charadd[30];//地址
}Record;
RecordInf[M];//全局变量
RecordH[M];//全局变量
【测试情况】
1.运行程序,显示主菜单并选择选项1来创建哈希表
2.执行选项1,输入元素内容
3.执行选项2,按用户名散列创建哈希表
4.执行选项3,按号码散列创建哈希表
5.执行选项4,按用户名查找
6.执行选项4,按号码查找
7.执行选项5,输出查找不成功的平均查找长度
【心得】
【源程序】
/*****电话号码查询系统*****/
#include
#include
#include
#defineM10
#defineNULLKEY"\0"
/*哈希表结构体*/
typedefstruct
{
charname[20];//用户名
charphone[20];//电话
charadd[20];//地址
}Record;
RecordInf[M];//定义辅助数组为全局变量
RecordH[M];//定义哈希表为全局变量
/*菜单函数*/
intmenu()
{
intm;
system("cls");
system("color0a");
printf("\t\t************电话号码查询系统*************\n");
printf("\n");
printf("\t\t______________主菜单_______________\n");
printf("\t\t|1.哈希表的创建|\n");
printf("\t\t|2.按用户名散列|\n");
printf("\t\t|3.按号码散列|\n");
printf("\t\t|4.查找操作|\n");
printf("\t\t|5.平均查找长度|\n");
printf("\t\t|0.退出程序|\n");
printf("\t\t-----------------------------------------\n");
printf("\n");
printf("\t\t\t请输入您的选项<0-5>:
\n");
scanf("%d",&m);
return(m);
}
//创建辅助数组
intCreate(RecordH[M])
{
inti;
charsign;
for(i=0;i<10;i++)//初始化哈希表
{
strcpy(H[i].add,"\0");
strcpy(H[i].phone,"\0");
strcpy(H[i].name,"\0");
}
i=0;
while(sign!
='n'&&sign!
='N')
{
printf("请输入名字\n");
scanf("%s",Inf[i].name);
printf("请输入号码\n");
scanf("%s",Inf[i].phone);
printf("请输入地址\n");
scanf("%s",Inf[i].add);
printf("\t\t\t还需要继续输入吗?
(Y/N)");
scanf("\t\t\t%c",&sign);
i++;
}
returni;
}
//以用户名为关键字的哈希函数
intHash_name(charname[20])
{
inti=0;
inta=0;
while(name[i]!
='\0')
{
a=a+name[i];
i++;
}
a=a%7;//对小于哈希表的最大素数求余,此处哈希表长为10,对7求余
return(a);
}
//再哈希
intname_again(charname[20])
{
inti,h;
h=(int)name[1];
for(i=2;i<20;i++)
h=h+(int)name[i];
h=h%7;
returnh;
}
//以用户名为关键字创建哈希表
voidcreat_name(RecordInf[M],intm,RecordH[M])
{
intj,key=0;
for(j=0;j { key=Hash_name(Inf[j].name);//计算哈希地址 while (1) { if(strcmp(H[key].name,NULLKEY)==0)//判断该位置是否为空,不为空就把辅助数组中的元素存到该位置 { strcpy(H[key].name,Inf[j].name); strcpy(H[key].phone,Inf[j].phone); strcpy(H[key].add,Inf[j].add); break; } else key++;//如果为空,采用线性探测法,将元素后移 } } } //再哈希法 voidagain_put(RecordInf[M],intm,RecordH[M]) { intj,key=0; for(j=0;j { key=Hash_name(Inf[j].name);//计算哈希地址 while (1) { if(strcmp(H[key].name,NULLKEY)==0)//辅助数组中的元素存到该位置 { strcpy(H[key].name,Inf[j].name); strcpy(H[key].phone,Inf[j].phone); strcpy(H[key].add,Inf[j].add); break; } else key=name_again(Inf[j].name);//再哈希 }} } //以号码为关键字的哈希函数 intHash_phone(charphone[20]) { inti=0; intb=0; while(phone[i]! ='\0')//计算电话号码中每个字符的ASCII码值相加 { b=b+phone[i]; i++; } b=b%7;//对小于哈希表的最大素数求余,此处哈希表长为10,对7求余 return(b); } //再哈希 intphone_again(charphone[20]) { inti,h; h=(int)phone[1]; for(i=2;i<20;i++) h=h+(int)phone[i]; h=h%7; returnh; } //以电话号码为关键字创建哈希表 voidcreat_phone(RecordInf[M],intm,RecordH[M]) { intj,key=0; for(j=0;j { key=Hash_phone(Inf[j].phone);//计算哈希地址 while (1) { if(strcmp(H[key].phone,NULLKEY)==0)//把辅助数组中的元素存到该位置 { strcpy(H[key].name,Inf[j].name); strcpy(H[key].phone,Inf[j].phone); strcpy(H[key].add,Inf[j].add); break; } else key++;//如果为空,采用线性探测法,将元素后移 } } } //再哈希法 voidagain_put2(RecordInf[M],intm,RecordH[M]) { intj,key=0; for(j=0;j { key=Hash_phone(Inf[j].phone);//计算哈希地址 while (1) { if(strcmp(H[key].phone,NULLKEY)==0)//判断该位置是否为空,不为空就把辅助数组中的元素存到该位置 { strcpy(H[key].name,Inf[j].name)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈希表 数据结构