哈希表的操作

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

哈希表操作

一目的

1.巩固和加深对哈希表的创建、查找、插入等方法理论知识的理解。

2.掌握建立哈希表的办法,本实验是采用的是除留余数法创建。

3.掌握哈希表解决冲突的办法,本实验用的是线性探测再散列的方法。

4.巩固对程序模块化设计的要求。

二需求分析

1.对于哈希表的基本操作首先是要创建一个哈希表,哈希表的创建思想是由哈希函

数得到,本实验就采用了除留余数法创建哈希表。

2.创建好哈希表就需要在哈希表中插入元素,本实验是需要插入单词,所以需要调

用string函数库,通过每个单词的地址数来进行下一步的查找计划。当插入单词地址已经存在时,就产生了冲突,因此需要采用线性探测再散列的方式来解决冲突。

3.当哈希表插入单词完成之后便可以显示哈希表的存储情况,因此需要输出整个哈

希表。

4.要想计算平均查找长度首先要对哈希表中的元素进行查找,当所有单词查找结

束,查找长度也得出。

5.要实现上诉需求,程序需要采用模块化进行设计。

三概要设计

1.基本操作:

void Initwordlist(int n) 初始化哈希表

操作结果:以字符形式插入单词,将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字。

void Createhashlist(int n) 创建哈希表,并插入单词

操作结果:

(1)用除留余数法构建哈希函数;

(2)用线性探测再散列处理冲突。

void find() 查找哈希表中的单词

操作结果:在哈希表中进行查找,输出查找的结果和关键字,并计算和输出查找成功的平均查找长度。

void printhash() 显示哈希表

操作结果:显示哈希表的存储情况:位置%d\t\t关键字%-6d\t\t单词%s\n。

float average()

操作结果:计算出平均查找长度。

void menu() 菜单函数设计

操作结果:显示格式:

1向哈希表中插入单词(<15);

2查找哈希表中的单词;

3显示哈希表的存储情况;

4计算哈希表的平均查找长度;

5退出程序。

int main() 主程序设计

操作结果:通过调用各个函数操作得到结果。

2.程序流程图:

四详细设计

1.全局变量:

#define HASH_LEN 15 // HASH_LEN长度定义为15

#define M 13 // 取模质数M 为13

2.存储结构设计:

WORD wordlist[HASH_LEN];//全局变量

typedef struct

{ char word[15];//输入的单词

int number;//单词所对应的整数

}WORD;

typedef struct

{ char *word;//存储输入的单词

int number;//单词所对应的整数

int numofseek;//查找的次数

}HASH;

HASH hashlist[HASH_LEN];//全局变量

3.哈希表初始化

void Initwordlist(int n)

{

int i,j;

char *w; //设立一个指针,指向单词的地址

for(i=0;i

{ int sum=0; //存放单词地址

printf("请输入第%d个单词(按回车结束):",i+1);

gets(wordlist[i].word); //输入单词

w=wordlist[i].word; //取地址

for(j=0;*(w+j)!=0;j++)//将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字

sum=sum+*(w+j);

wordlist[i].number=sum; //存入每个单词的存放地址,即关键字

}

4.哈希表的创建

void Createhashlist(int n)//创建哈希表,并插入单词

{ int i;

for(i=0;i

{

hashlist[i].word="";//输入单词

hashlist[i].number=0; //关键字

hashlist[i].numofseek=0; //查找次数

}

for(i=0;i

{ int address,sum=0;

address=wordlist[i].number%M; //除留余数法,将单词插入到哈希表中

if(hashlist[address].numofseek==0)

{

hashlist[address].word=wordlist[i].word;

hashlist[address].number=wordlist[i].number;

hashlist[address].numofseek=1;

}

else

{ int d; //d为冲突次数

d=1;

do

{address=(wordlist[i].number+d)%M; //线性探测解决冲突

d++;

sum++;

}

while(hashlist[address].numofseek!=0);

hashlist[address].word=wordlist[i].word;

hashlist[address].number=wordlist[i].number;

hashlist[address].numofseek=sum+1;

}

}

}

5.哈希表的查找

相关文档
最新文档