数据结构之哈希表设计
1.实验题目
针对某个集体中人名设计一个哈希表,使得平均查找长度不超过R,并完成相应的建表和查表程序。
2.需求分析
本次实习旨在集中对几个专门的问题作较为深入的探讨和理解,也强调对某些特定的编程技术的训练。
①输入的形式和输入值的范围:根据提示输入d进行排序操作。
②输出的形式:输出排序的哈希表及平均查找长度。
③程序所能达到的功能:图的创建、遍历、插入、删除、最短路径
④测试数据:取读者周围较熟悉的 30 个人名。
3.概要设计
1)为了实现上述程序功能,需要定义哈希表的抽象数据类型:
1 typedef struct 2 3 { char *py; 4 5 int k; 6 7 }NAME; //名字拼音及列表 8 9 NAME NameList[HASH_LENGTH]; 10 11 typedef struct //哈希表 12 13 { char *py; 14 15 int k; 16 17 int si; 18 19 }HASH;
2)本程序包含 5 个函数:
主函数main()
②名字初始化函数 InitNameList()
③建立哈希表函数CreateHashList()
④查找函数 FindList()
⑤显示哈希表函数 Display()
4.详细设计
实现概要设计中定义的所有的数据类型,对每个操作给出伪码算法。对主程序和其他模 块也都需要写出伪码算法。
1) 结点类型和指针类型
1 typedef struct 2 3 { char *py; 4 5 int k; 6 7 }NAME; //名字拼音及列表 8 9 NAME NameList[HASH_LENGTH]; 10 11 typedef struct //哈希表 12 13 { char *py; 14 15 int k; 16 17 int si; 18 19 }HASH; 20 21 HASH HashList[HASH_LENGTH];
2)其他模块伪码算法
主函数main()
{利用子函数实现哈希表的显示和查找。}
名字初始化函数 InitNameList()
{利用for函数实现名字列表的初始化。}
建立哈希表函数CreateHashList()
{创建哈希表,利用for循环给HashList[]各参数赋初值}
查找函数 FindList()
{使用哈希函数,利用姓名拼音对应的关键字,使用if语句,
进行判断,若有记录则输出姓名,关键字和查找长度;
若无,则输出无此记录。}
显示哈希表函数 Display()
{利用for循环实现哈希表的显示,在用平均数的方法计算平均查找长度。}
5.调试分析
将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字。
6.使用说明
程序执行后显示: d:显示哈希表 f:查找 请选择:
按照提示键入即可。
7.测试结果
8.附代码

1 // 实验五.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 6 #include<iostream> 7 #include<string> 8 using namespace std; 9 #define HASH_LENGTH 50 //事先定义哈希表的长度 10 #define M 47 //选取随机数 11 #define NAME_NO 30 //定义人名的个数 12 13 typedef struct NAME 14 { char *py; //名字的拼音 15 int k; //拼音所对应的整数 16 }NAME; 17 18 NAME NameList[HASH_LENGTH]; //全局变量NAME 19 20 typedef struct //构造哈希表 21 { char *py; //名字的拼音 22 int k; //拼音所对应的整数 23 int si; //查找长度 24 }HASH; 25 26 HASH HashList[HASH_LENGTH]; //全局变量HASH 27 28 void InitNameList() //初始化姓名(结构体数组) 29 { char *f; 30 int r,s0,i; 31 for (i=0; i<HASH_LENGTH; i++) 32 { 33 NameList[i].py = new char[64]; 34 NameList[i].py[0] = 0; 35 } 36 strcpy(NameList[0].py, "zhangsan"); 37 strcpy(NameList[1].py, "lisi"); 38 strcpy(NameList[2].py, "liang"); 39 strcpy(NameList[3].py, "lala"); 40 strcpy(NameList[4].py, "youyou"); 41 strcpy(NameList[5].py, "zhaolala"); 42 strcpy(NameList[6].py, "suner"); 43 strcpy(NameList[7].py, "zhouzhou"); 44 strcpy(NameList[8].py, "tangtag"); 45 strcpy(NameList[9].py, "qiuqiu"); 46 strcpy(NameList[10].py, "lai"); 47 strcpy(NameList[11].py, "ye"); 48 strcpy(NameList[12].py, "dai"); 49 strcpy(NameList[13].py, "linjiajia"); 50 strcpy(NameList[14].py, "shang"); 51 strcpy(NameList[15].py, "yangyang"); 52 strcpy(NameList[16].py, "duoduo"); 53 strcpy(NameList[17].py, "xihua"); 54 strcpy(NameList[18].py, "luehh"); 55 strcpy(NameList[19].py, "nkjhi"); 56 strcpy(NameList[20].py, "chenwei"); 57 strcpy(NameList[21].py, "jyuj"); 58 strcpy(NameList[22].py, "jgjjh"); 59 strcpy(NameList[23].py, "djtryu"); 60 strcpy(NameList[24].py, "shrt"); 61 strcpy(NameList[25].py, "dejeyy"); 62 strcpy(NameList[26].py, "sntr"); 63 strcpy(NameList[27].py, "mkyjyu"); 64 strcpy(NameList[28].py, "dtur"); 65 strcpy(NameList[29].py, "ruj"); 66 67 for(i=0;i<NAME_NO;i++) 68 { 69 s0=0; 70 f=NameList[i].py; 71 for(r=0;*(f+r)!='