目 录
1 需 求 分 析 … 1
1.1 Hash 表设计 … 1
1.2 添加与导入记录 … 1
1.3 查询记录 … 2
1.4 不 同 Hash 函 数 比 较 … 2
1.5 不同冲突解决方法比较 … 2
2 概 要 设 计 … 2
2.1 数据类型的定义 … 2
2.2 功能模块结构图 … 5
2.3 Hash 模 块 概 要 设 计 … 6
3 运 行 环 境 … 7
4 开发工具和编程语言… 7
5 详 细 设 计 … 7
5.1 Hash 函数设计 … 7
5.2 链地址法 Hash 设计 … 9
5.3 线性探测法 Hash 表设计 … 16
5.4 电话号码查询系统设计 … 19
6 运 行 结 果 … 21
7 调 试 分 析 … 25
8 心 得 体 会 … 26
9 参 考 文 献 … 27
3运行环境
硬件环境:
cpu:Intel® Core™ i7-6500U CPU @ 2.50GHz × 4 内存:8G
软件环境:
OS:Ubuntu 18.04.1 LTS 64 位
Linux 内核:Linux version 4.4.0-17134-Microsoft
4开发工具和编程语言
编辑软件:
Visual Studio Code 1.30.1 编译软件:
GNU G++ version 7.3.0 构建工具:
GNU Make 4.1 编程语言:
C++语言
根据需求分析,为了满足用户的功能需求,将系统划分为以下几个模块:Hash表模块、查询记录模块、添加记录模块、导入记录模块、Hash 函数比较模块、冲突解决办法比较模块。其中 Hash 表模块包括链表实现的 Hash 表子模块和线性探测法实现的 Hash 表子模块,查询记录模块包括电话号码查询子模块和姓名查询子模块。
图 1 模块结构图
2概要设计
2.1数据类型的定义
1)使用链地址法的 Hash ADT 设计
#define MAXCAPACITY 1 << 30
#define LOADFACTOR 0.75f
#define MAXKEYLEN 255
typedef AddList ElemType; struct Node
{
char key[MAXKEYLEN];
ElemType value;
Node *next;
};
struct HashTable
{
int capacity;
int size;
Node *table;
};
int NextPrime(int n);
void InitHashTable(HashTable &hash_table, int init_capacity); unsigned int SumHash(const char *key, int table_size); unsigned int ShiftHash(const char *key, int table_size); unsigned int ELFHash(const char *key, int table_size);
bool Put(HashTable &hash_table, const char *key, ElemType value, ElemType &old_value, unsigned int (*Hash)(const char *key, int table_size));
bool Get(HashTable &hash_table, const char *key, ElemType &value, unsigned int (*Hash)(const char *key, int table_size));
bool Remove(HashTable &hash_table, const char *key, ElemType &value, unsigned int (*Hash)(const char *key, int table_size));
void DelHashTable(HashTable &hash_table);
void TraverseHashTable(HashTable &hash_table, void (*visit)(ElemType v)); double GetASL(HashTable &hash_table, unsigned int (*Hash)(const char *key, int table_size));
2)使用线性探测法的 Hash ADT 设计typedef AddList ArrElemType;
// 散列单元状态类型,分别对应:有合法元素、空单元、有已删除元素typedef enum { Legitimate, Empty, Deleted } NodeType;
struct HashNode {
char key[MAXKEYLEN];
ArrElemType value;
NodeType type;
};
struct ArrayHashTable {
int size;
int capacity;
HashNode *table;
};
void InitArrayHashTable(ArrayHashTable &hash_table, int init_capacity); void DelArrayHashTable(ArrayHashTable &hash_table);
bool IsFull(ArrayHashTable &hash_table);
bool LinearDelete(ArrayHashTable &hash_table, const char *key);
bool LinearGet(ArrayHashTable &hash_table, const char *key, ArrElemType &value);
bool LinearGetNum(ArrayHashTable &hash_table, const char *key, ArrElemType &value, int &num);
int LinearPut(ArrayHashTable &hash_table, const char *key, ArrElemType value, ArrElemType &old_value);
3)电话查找系统数据类型定义struct AddList {
char phone_num[MAXPHONENUM];
char name[MAXNAME];
char address[MAXADDRESS];
AddList() {}
AddList(const char *phone_num, const char *name, const char *address)
{
strcpy(this->phone_num, phone_num);
strcpy(this->name, name);
strcpy(this->address, address);
}
};