哈希表数据结构课设.docx

上传人:b****1 文档编号:660728 上传时间:2022-10-11 格式:DOCX 页数:21 大小:85.63KB
下载 相关 举报
哈希表数据结构课设.docx_第1页
第1页 / 共21页
哈希表数据结构课设.docx_第2页
第2页 / 共21页
哈希表数据结构课设.docx_第3页
第3页 / 共21页
哈希表数据结构课设.docx_第4页
第4页 / 共21页
哈希表数据结构课设.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

哈希表数据结构课设.docx

《哈希表数据结构课设.docx》由会员分享,可在线阅读,更多相关《哈希表数据结构课设.docx(21页珍藏版)》请在冰豆网上搜索。

哈希表数据结构课设.docx

哈希表数据结构课设

 

洛阳理工学院

课程设计说明书

 

课程名称数据结构

设计课题哈希表的设计与实现

专业

班级

学号

姓名

完成日期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)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1