哈希表的操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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.哈希表的查找