基于C语言的散列表实现的电话号码查找系统

该文档详细介绍了设计一个电话号码查询系统的过程,采用Hash表作为核心数据结构,包括链地址法和线性探测法实现,涉及需求分析、概要设计、数据类型定义、功能模块如添加、查询和删除记录的实现,以及冲突解决策略的比较。
摘要由CSDN通过智能技术生成

目 录

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);             
        } 
}; 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值