数据结构课程设计--哈希表实验报告Word格式.doc

上传人:b****3 文档编号:15186709 上传时间:2022-10-28 格式:DOC 页数:18 大小:434KB
下载 相关 举报
数据结构课程设计--哈希表实验报告Word格式.doc_第1页
第1页 / 共18页
数据结构课程设计--哈希表实验报告Word格式.doc_第2页
第2页 / 共18页
数据结构课程设计--哈希表实验报告Word格式.doc_第3页
第3页 / 共18页
数据结构课程设计--哈希表实验报告Word格式.doc_第4页
第4页 / 共18页
数据结构课程设计--哈希表实验报告Word格式.doc_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

数据结构课程设计--哈希表实验报告Word格式.doc

《数据结构课程设计--哈希表实验报告Word格式.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计--哈希表实验报告Word格式.doc(18页珍藏版)》请在冰豆网上搜索。

数据结构课程设计--哈希表实验报告Word格式.doc

姓名以汉语拼音形式,待填入哈希表的人名约30个,自行设计哈希函数,用线性探测再散列法或链地址法处理冲突;

在查找的过程中给出比较的次数。

完成按姓名查询的操作。

运行的环境:

MicrosoftVisualC++6.0

二、算法基本思想描述

设计一个哈希表(哈希表内的元素为自定义的结构体)用来存放待填入的30个人名,人名为中国姓名的汉语拼音形式,用除留余数法构造哈希函数,用线性探查法解决哈希冲突。

建立哈希表并且将其显示出来。

通过要查找的关键字用哈希函数计算出相应的地址来查找人名。

通过循环语句调用数组中保存的数据来显示哈希表。

三、设计

1、数据结构的设计和说明

(1)结构体的定义

typedefstruct//记录

{

NAname;

NAxuehao;

NAtel;

}Record;

录入信息结构体的定义,包含姓名,学号,电话号码。

typedefstruct//哈希表

Record*elem[HASHSIZE];

//数据元素存储基址

intcount;

//当前数据元素个数

intsize;

//当前容量

}HashTable;

哈希表元素的定义,包含数据元素存储基址、数据元素个数、当前容量。

2、关键算法的设计

(1)姓名的折叠处理

longfold(NAs)//人名的折叠处理

char*p;

longsum=0;

NAss;

strcpy(ss,s);

//复制字符串,不改变原字符串的大小写

strupr(ss);

//将字符串ss转换为大写形式

p=ss;

while(*p!

='

\0'

sum+=*p++;

printf("

\nsum====================%d"

sum);

returnsum;

}

(2)建立哈希表

1、用除留余数法构建哈希函数

2、用线性探测再散列法处理冲突

intHash1(NAstr)//哈希函数

longn;

intm;

n=fold(str);

//先将用户名进行折叠处理

m=n%HASHSIZE;

//折叠处理后的数,用除留余数法构造哈希函数

returnm;

//并返回模值

}Statuscollision(intp,intc)//冲突处理函数,采用二次探测再散列法解决冲突

inti,q;

i=c/2+1;

while(i<

HASHSIZE){

if(c%2==0){

c++;

q=(p+i*i)%HASHSIZE;

if(q>

=0)returnq;

elsei=c/2+1;

}

else{

q=(p-i*i)%HASHSIZE;

}

returnUNSUCCESS;

voidbenGetTime();

voidCreateHash1(HashTable*H,Record*a)//建表,以人的姓名为关键字,建立相应的散列表

{inti,p=-1,c,pp;

system("

cls"

);

//若哈希地址冲突,进行冲突处理

benGetTime();

for(i=0;

i<

NUM_BER;

i++){

c=0;

p=Hash1(a[i].name);

pp=p;

while(H->

elem[pp]!

=NULL){

pp=collision(p,c);

if(pp<

0){

printf("

第%d记录无法解决冲突"

i+1);

//需要显示冲突次数时输出

continue;

}//无法解决冲突,跳入下一循环

H->

elem[pp]=&

(a[i]);

//求得哈希地址,将信息存入

count++;

第%d个记录冲突次数为%d。

\n"

i+1,c);

//需要显示冲突次数时输出

printf("

\n建表完成!

\n此哈希表容量为%d,当前表内存储的记录个数为%d.\n"

HASHSIZE,H->

count);

(3)查找哈希表

voidSearchHash1(HashTable*H,intc)//在通讯录里查找姓名关键字,若查找成功,显示信息

{intp,pp;

NAstr;

//c用来记录冲突次数,查找成功时显示冲突次数

\n请输入要查找记录的姓名:

scanf("

%s"

str);

p=Hash1(str);

pp=p;

while((H->

=NULL)&

&

(eq(str,H->

elem[pp]->

name)==-1))

pp=collision(p,c);

if(H->

=NULL&

eq(str,H->

name)==1){

\n查找成功!

\n查找过程冲突次数为%d.以下是您需要要查找的信息:

\n\n"

c);

姓名:

%s\n学号:

%s\n电话号码:

%s\n"

H->

name,H->

xuehao,H->

tel);

elseprintf("

\n此人不存在,查找不成功!

(4)显示哈希表

voidShowInformation(Record*a)//显示输入的用户信息

{inti;

system("

for(i=0;

i++)

\n第%d个用户信息:

\n姓名:

%s\n学号:

%s\n电话号码:

i+1,a[i].name,a[i].xuehao,a[i].tel);

(5)主函数的设计

voidmain(intargc,char*argv[])

{Recorda[MAXSIZE];

intc,flag=1,i=0;

HashTable*H;

H=(HashTable*)malloc(LEN);

HASHSIZE;

elem[i]=NULL;

size=HASHSIZE;

count=0;

while

(1)

{intnum;

printf("

\n"

\n欢迎使用同学通讯录录入查找系统"

\n哈希表的设计与实现"

\n【1】.添加用户信息"

\n【2】.读取所有用户信息"

\n【3】.以姓名建立哈希表(再哈希法解决冲突)"

\n【4】.以电话号码建立哈希表(再哈希法解决冲突)"

\n【5】.查找并显示给定用户名的记录"

\n【6】.查找并显示给定电话号码的记录"

\n【7】.清屏"

\n【8】.保存"

\n【9】.退出程序"

\n温馨提示:

"

\nⅠ.进行5操作前请先输出3"

\nⅡ.进行6操作前请先输出4"

请输入一个任务选项>

>

"

scanf("

%d"

&

num);

switch(num){

case1:

getin(a);

break;

case2:

ShowInformation(a);

case3:

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

当前位置:首页 > 工程科技 > 冶金矿山地质

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

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