哈希表实现电话号码查询系统
数据结构之哈希表
实验目的:
1.训练与培养解决实际问题的能力
2.学会面对一个问题时应该如何分析问题,设计解决方法,实际编码及结果测试。
3.熟悉哈希表的使用
4.设计哈希表实现电话号码查询系统。
5.设计程序完成以下要求:
(1)设每个记录有下列数据项:电话号码、用户名、地址;
(2)从键盘输入各记录,以电话号码为关键字建立哈希表(至少要有12个以上的记录,哈希表的长度为8);
(3)采用链地址法解决冲突;
(4)显示建立好的哈希表,对于学有余力的同学可以实现哈希表的查找。
实验仪器与设备:
计算机
实验内容:
(1)采用除留余数法进行哈希表的散列,即以电话号码作为主关键字,将电话号码的11位相加,按照模7取余;
(2)解决冲突用链地址法。、
(3)实现哈希表的显示与号码的查询
实验方法与步骤:
1.根据问题进行分析,明确要解决的问题是什么,怎样解决
2.根据分析设计问题求解算法
3.用特定语言对设计进行编码
4.对程序进行测试
实验原理:
1.对于哈希电话本问题的分析:哈希表问题实际上和图问题一样,先创建一个数组。在号码存入时,如果数组中哈希关键字位置没有写入号码,则在
该处写入,并把该处设置为已写入。如果该处已写入号码,则在该处建立
新的结点,并写入号码。
2.号码显示用for和while两个循环,具体实现过程可看附录代码。
3.号码查询按号码显示的函数书写,只是实现函数不同。
实验心得:
通过这次的实验,我更加熟练了分析问题的方法。深刻题解算法的重要性。
本次的算法实现中,对算法的时间空间复杂度进行了优化处理。这是一个
以前没做过的地方。
在哈希表的显示与查询中,出了一个错误,在纸上模拟了很久也没看出问
哈希表的设计与实现
令胆嗲院
计算机科嗲b练水系
课程设计报告
2007 2008 学年第 2 学期
课程数据结构与算法
课程设计名称哈希表的设计与实现
学生姓名
学号0604011026
专业班级06计科(1)
指导教师
2008 年9 月
课程设计题目:
(哈希表的设计与实现的问题〉设计哈希表实现电话号码查询系统。设计程序完成以下要
求:(1)设每个记录有下列数据项:电话号码、用户名、地址:(2)从键盘输入各记录,分别以电话号码和用户名为关键字建立晗希表;(3)采用再哈希法解决冲突;(4)查找并显示
给定电话号码的记录:(5)查找并显示给定用户的记录。
一、问题分析和任务定义
1、问题分析
要完成如下要求:设计晗希表实现电话号码查询系统。实现本程序需要解决以下几个问题:
(1) 如何设计一个结点使该结点包括电话号码、用户名、地址。
(2) 如何分别以电话号码和用户名为关键字建立哈希表。
(3) 如何利用再晗希法解决冲突。
(4) 如何实现用晗希法查找并显示给定电话号码的记录。
(5) 如何查找并显示给定用户的记录。
2、任务定义
由问题分析知,本设计主要要求分别以电话号码和用户名为关键字建立晗希表,并实现查找功能。所以本设计的核心问题是如何解决散列的问题,亦即设计一个良好的哈希表。由于结点的个数无法确认,并且如果采用线性探测法散列算法,删除结点会引起“信息丢失”的问题。所以采用链地址法散列算法。采用链地址法,当出现同义词冲突时,使用链表结构把同义词链接在一起,即同义词的存储地址不是散列表中其他的空地址。
决的是定义链表结点,在链地址法中,每个结点对应一个链表结点,它由三个首先,解
设计哈希表建立电话号码查询系统.doc
设计哈希表建立电话号码查询系统
一、需求分析
1.本演示程序中,输入的形式为一个以“回车符”为标志的字符串和整型数字,其输入值的形式为26个英文字母,并且区分大小写,以及整型数字1~6。
2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”后,由用户在键盘上输入演示程序中规定的运算命令,相应的输入数据和字符以及运算结果显示在其后。
3.程序所能达到的功能:用户输入姓名或者电话号码之后,屏幕上将会显示用户相关的信息,即姓名、电话号码和地址,如果通讯录上没有该用户的相关信息,则会提醒用户记录不存在,并且系统将自动保存该用户的信息。
4.初步测试计划:输入记录中存在的用户姓名,查看输出结果;
输入记录中存在的用户电话号码,查看输出结果;
输入任意一个姓名,查看输出结果;
输入任意一个电话号码,查看输出结果;
二、概要设计
1.用哈希表建立电话号码查询系统的数据类型定义:
struct person{char name[10];char number[14];char
address[25];}p[M],q[M];
分别以人的姓名、电话号码和地址建立结构体数组p和q,其容量大小为M。
FILE *fp1,*fp2 ;
分别定义指向文件old.txt和out.txt的文件指针fp1和fp2。
int hash1(char number[ ] );
计算数组number里面的每个字符的ASCII值相加之和,
操作结果为返回和值,并且返回值为整型。
int hash2(char name[ ] );
计算数组name里面的每个字符的ASCII值相加之和,
哈希表实现电话号码查询 源程序
哈希表存储的电话号码查询
设每个记录有以下数据项:用户名、电话、地址;
从键盘输入各记录,以电话号码为关键字建立哈希表;
采用链地址法方法解决冲突;
能够查找并显示给定电话号码的相关记录。
#include <iostream.h>
#include <stdlib.h>
#include <cstdio>
#include <sstream>
#define MAX_LEN 60
// 学生信息类
class Student
{
private:
char _name[MAX_LEN]; // 姓名
char _phone[MAX_LEN]; // 电话
char _addr[MAX_LEN]; // 地址
public:
Student();
const char* getName() ; //变量不允许被改变
const char* getPhone();
const char* getAddr();
void setName(const char* name);
void setPhone(const char* phone);
void setAddr(const char* addr);
};
Student::Student()
{
memset(_name,0,MAX_LEN);
memset(_phone,0,MAX_LEN);
memset(_addr,0,MAX_LEN);
}
const char* Student::getName()
{
return _name;
}
const char* Student::getPhone()
(完整word版)哈希表实现电话号码查询报告
《数据结构》
课程设计报告书
题目:哈希表存储的电话号码查询专业:
学号:
学生姓名:
指导教师:
完成日期:
目录
1.实训题目………………………………………………
1。1实训要求…………………………………………. 1。2需求分析…………………………………………。
2.系统设计………………………………………………
2。1总体设计………………………………………….. 2。2详细设计…………………………………………。。
2。2。1程序头文件…………………………………。。
2。2.2学生信息类及哈希表类……………………。.
2.2.3主函数流程…………………………………。. 3。系统实现………………………………………………。
3.1编码………………………………………………。。3。2测试………………………………………………。。4。归纳总结……………………………………………….
4.1实训中遇到的问题以及解决办法………………。.
4.2感想和心得体会…………………………………。。5。参考资料………………………………………………
1.实训题目
1.1实训要求
⏹设每个记录有以下数据项:用户名、电话、地址;
⏹从键盘输入各记录,以电话号码为关键字建立哈希表;
⏹采用链地址法方法解决冲突;
⏹能够查找并显示给定电话号码的相关记录。
1。2需求分析
本次实验要求采用哈希表完成信息的查找和储存,哈希表即为散列表。本程序采用学生信息管理为例,设每个学生有电话号码,学生姓名,家庭住址三个信息。通过建立哈希表储存信息,信息储存在节点中,并通过以电话号码为关键字完成查找,并显示出该学生的姓名,电话号码以及家庭住址.当哈希表中的数据与输入的数据发生冲突时,使用节点向后移一位的方法来解决冲突。
哈希表制作通讯录 数据结构程序设计
软件学院
课程设计报告书
课程名称数据结构
设计题目哈希表制作通讯录专业班级
学号
姓名
指导教师
2014年 1月
目录
1 设计时间 0
2 设计目的 0
3设计任务 0
4 设计内容 0
4.1需求分析 0
4.11程序所能达到的功能 0
4.12输入的形式和输入的范围 0
4.2总体设计 (1)
4.21说明本程序中用到的所有抽象数据类型的定义 (1)
4.22说明主程序的流程 (1)
4.23说明各程序模块之间的层次(调用)关系 (2)
4.3详细设计 (3)
4.31实现概要设计中定义的所有数据类型,对每个操作只需要写出
伪码算法 (3)
4.32对主程序和其它主要函数写出伪码算法 (5)
4.4测试 (6)
4.5 附录 (8)
5 总结与展望 (21)
参考文献 (23)
成绩评定 (23)
inputs("请输入城市:",info->city,15);
inputs("请输入国家:",info->state,15);
inputs("请输入电话:",info->tel,7);
insert(info,&start,&last); /*调用结点插入函数*/ }
4.4测试
图4-1 程序运行图
图4-2输入信息图
(完整word版)哈希表实现电话号码查询系统
哈希表实现电话号码查询系统
一目的
利用《数据结构》课程的相关知识完成一个具有一定难度的综合设计题目,利用
C/C++语言进行程序设计,并规范地完成课程设计报告。通过课程设计,巩固和加深对线性表、栈、队列、字符串、树、图、查找、排序等理论知识的理解;掌握现实复杂问题的分析建模和解决方法(包括问题描述、系统分析、设计建模、代码实现、结果分析等);提高利用计算机分析解决综合性实际问题的基本能力。
二需求分析
1、程序的功能
1)读取数据
①读取原电话本存储的电话信息。
②读取系统随机新建电话本存储的电话信息。
2)查找信息
①根据电话号码查询用户信息。
②根据姓名查询用户信息。
3)存储信息
查询无记录的结果存入记录文档。
2、输出形式
1)数据文件“old.txt”存放原始电话号码数据。
2)数据文件“new.txt”存放有系统随机生成的电话号码文件。
3)数据文件“out.txt”存放未查找到的电话信息。
4)查找到相关信息时显示姓名、地址、电话号码。
3、初步测试计划
1)从数据文件“old.txt”中读入各项记录,或由系统随机产生各记录,并且把记录保存
到“new.txt”中。
2)分别采用伪随机探测再散列法和再哈希法解决冲突。
3)根据姓名查找时显示给定姓名用户的记录。
4)根据电话号码查找时显示给定电话号码的用户记录。
5)将没有查找的结果保存到结果文件Out.txt中。
6)系统以菜单界面工作,运行界面友好,演示程序以用户和计算机的对话方式进行。三概要设计
1、子函数功能
int Collision_Random(int key,int i)
哈希表简单例子
哈希表简单例子
哈希表是一种常用的数据结构,它可以用来存储键值对,并且能够以常数时间复杂度进行查找、插入和删除操作。在这篇文章中,我将给大家列举一些哈希表的简单例子,希望能够帮助大家更好地理解和应用哈希表。
1. 学生信息管理系统:我们可以将学生的学号作为键,学生的姓名作为值,通过哈希表来管理学生的信息。这样,我们就可以通过学生的学号快速地查找到对应的姓名,而不需要遍历整个数据集。
2. 图书馆借阅系统:我们可以将图书的编号作为键,借阅者的信息(如姓名、借书日期等)作为值,通过哈希表来管理图书的借阅情况。这样,当有人借阅或归还图书时,我们可以快速地定位到对应的图书并更新借阅信息。
3. 联系人电话簿:我们可以将联系人的姓名作为键,电话号码作为值,通过哈希表来管理联系人的电话号码。这样,当我们需要查找某个联系人的电话时,可以直接通过姓名进行查找,而不需要遍历整个电话簿。
4. 缓存系统:在计算机系统中,缓存用于存储经常访问的数据,以提高访问速度。我们可以使用哈希表来实现缓存系统,将数据的关键字作为键,数据本身作为值。这样,当需要访问某个数据时,可以首先在哈希表中查找,如果存在则直接返回,否则再从存储介质
中读取数据。
5. 单词计数器:在文本处理中,我们经常需要统计某个单词在文本中出现的次数。我们可以使用哈希表来实现一个简单的单词计数器,将单词作为键,出现的次数作为值。这样,当需要统计某个单词的出现次数时,可以直接通过键进行查找。
6. 数组去重:在一组数据中,我们经常需要去除重复的元素。我们可以使用哈希表来实现数组的去重功能,将数组中的元素作为键,出现的次数作为值。这样,当需要判断某个元素是否重复时,可以直接通过键进行查找。
哈希表的设置与实现
哈希表的设置与实现
课程设计任务书
设计题目:哈希表的设置与实现
_________________________________________________________ 设计内容与要求:
1.【问题描述】
设计哈希表实现电话号码查询系统。
2.【基本要求】
1、设每个记录有下列数据项:电话号码、用户名、地址;
2、从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表;
3、采用再哈希法解决冲突;
4、查找并显示给定电话号码的记录;
5、查找并显示给定用户名的记录。
6、在哈希函数确定的前提下,尝试各种不同类型处理冲突的方法(至少两种),考察平均查找长度的变化。
指导教师:
2018年12月27日
课程设计评语
成绩:
指导教师:
年月日
目录
第1章需求分析 (3)
1.1设计内容 (3)
1.2数据需求 (3)
1.3数据结构描述 (3)
第2章概要设计 (4)
2.1系统结构与模块功能 (4)
2.2系统模块 (4)
第3章详细设计与实现 (5)
3.1模块流程图 (5)
3.2界面效果图及代码 (7)
3.3源代码 (11)
第4章总结 (18)
第1章需求分析
1.1设计内容
设计哈希表实现电话号码查询系统。通过对姓名和电话号码构造哈希函数,接着根据姓名和号码进行查询,并计算它的平均查找长度。并且尝试多种方法解决冲突,但至少使用两种方法来解决。
1.2数据需求
1、设每个记录有下列数据项:电话号码、用户名、地址;
2、从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表;
3、采用再哈希法解决冲突;
4、查找并显示给定电话号码的记录;
数据结构课程设计报告——哈希表实现电话号码查询
数据结构课程设计报告
一、需求分析
1问题描述:
根据需要设计出合理的Hash函数,并由此建立相应的Hash表。要求:
1)每个电话用户信息包括(姓名,电话,住址)信息。
2)可以使用姓名与地址查找相应的用户信息。
3)使用Hash表实现。使用开放定址法解决冲突。
2 基本要求:
1)记录每个用户的姓名、地址和电话。
2)从键盘输入,以姓名和地址为关键字分别建立Hash表。
3)用开放地址法解决冲突。
4)分别按姓名和地址查找并显示电话号码。
二、概要设计
三、详细设计
typedef struct //定义结构Hash表
{
定义Hash表内的所有成员
}HashTable[MaxSize];
int Key(char x[])//关键字转换为数值
{
求字符数组x每个字符对应的asc
值的绝对值之和,并返回最后结果
}
void CreateHT(HashTable ha)//创建Hash表
{
创建Hash表,并初始化它
}
void InsertHTna(HashTable ha,int &n,KeyType k,int d) //按姓名插入
{
以姓名为关键字,调用关键字转换函数将对应的电话号码存储到相应的存储
空间。若该位置已经被存储,则向后移一位(当移到最后一位,就移到头
部继续)。若还有冲突重复上一步。当所有空间都查过一遍,发现没有空位,
则输出“没有存储空间”。
}
void InsertHTadd(HashTable ha,int &n,KeyType k,int d)//按地址插入
{
以地址为关键字,调用关键字转换函数将对应的电话号码存储到相应的存储
[数据结构课程设计通讯录查询系统实验报告范文及源代码]数据结构通讯录
[数据结构课程设计通讯录查询系统实验报告范文及源代
码]数据结构通讯录
工程名称:停车管理系统
姓名:
学号:
专业:软件工程
1.需求分析
为某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的与地址。设计散列表存储,设计并实现通讯录查找系统。
1.根本要求
〔1〕每个记录有以下数据项:号码、用户名、地址;
〔2〕从键盘输入各记录,分别以号码为关键字建立散列表;
〔3〕采用二次探测再散列法解决冲突;
〔4〕查找并显示给定号码的记录;
〔5〕通讯录信息文件保存。
2.重点、难点
重点:
〔1〕通过实验深入理解哈希表既是一种存储形式,又是一种查找方法;
〔2〕哈希表的构造;
〔3〕哈希冲突方案的设计。
难点:哈希表的构造与哈希冲突方案的设计
输入的形式和输入值的范围;
输入三个字符串:
分别是号码,姓名,地址,每行一个数据
字符串长度适当
如:
号码〔纯数字〕
姓名
地址
输出的形式;
如:
姓名号码地址
程序所能到达的功能。
1:
并且通过号码为关键字,用二次再散列法寻找地址储存在哈希表中。2:
3:
4:
5:显示通讯录
6:把通讯录写入文件储存。
2.概要设计
(1)数据结构
tructlit
{
chara[12];
charname[15];
charadd[15];
intf=0;
};
用连续的内存空间构建哈希表
tructqtack
{
tructlit某bae;
inti;
};
(2)程序模块
1:
构建二次再散列:
inti;
for(i=1;i<25;i++)
d[2某i]=-1某i某i;
for(i=1;i<25;i++)/某构造二次再散列某/
d[i+i-1]=i某i;
设计哈希表实现电话号码查询系统C语言版(课程设计报告)
设计哈希表实现查询系统
一﹑目的
通过课程设计,巩固和加深对结构体、文件、哈希表等理论知识的理解;掌握现实复杂问题的分析建模和解决方法,掌握包括问题描述、系统分析、设计建模、代码实现、结果分析等的方法;提高利用计算机分析解决综合性实际问题的基本能力;锻炼个人动手能力,历练自身素质。
哈希表实现查询系统是利用哈希表实现系统的快速查询,程序实现哈希表建表和查表,并实现对没有查找到的内容进行记录。掌握哈希表的工作原理,熟悉建立哈希表、对哈希表冲突处理、哈希表查找等功能的实现,回顾文件读取、写入,回顾随机函数的作用。二﹑需求分析
1.输入的形式和输入值的范围
数据输入分两种模式:一种是将原有数据记录在old.txt文档中,由程序读入;另一种是由程序随机生成,并储存在new.txt文档中。数据的格式为:##、、家庭住址。
用户使用时显示菜单,用户输入菜单选项完成操作。
2.输出的形式
查找的结果显示在屏幕上。未被查找到的内容输出到out.txt文档中。在用户需要时,将哈希表显示在屏幕上。
3.程序所能达到的功能
根据用户的选择,从原有文档读入数据或随机生成数据,分别以##和做为关键字生成哈希表。生成哈希表后用户可以根据相应关键字进行数据的查找,若查找到对应的数据则将数据输出到屏幕,若没有查找到对应的数据则将用户输入的查找内容输出到out.txt文档。在用户选择显示哈希表时,显示完整的哈希表。
程序使用文字菜单的友好界面。在数据输入时对输入内容进行范围控制。
4.初步测试计划
在old.txt文档中输入30条记录,令程序读入并分别以##和做为关键字生成哈希表,查找记录中原有的记录,查看输出数据,查找记录中没有的记录查看回馈,查看整个哈希表的数据。
数据结构课程设计报告——哈希表实现电话号码查询
数据结构课程设计报告
一、需求分析
1问题描述:
根据需要设计出合理的函数,并由此建立相应的表。
要求:
1)每个电话用户信息包括(姓名,电话,住址)信息。
2)可以使用姓名与地址查找相应的用户信息。
3)使用表实现。使用开放定址法解决冲突。
2 基本要求:
1)记录每个用户的姓名、地址和电话。
2)从键盘输入,以姓名和地址为关键字分别建立表。
3)用开放地址法解决冲突。
4)分别按姓名和地址查找并显示电话号码。
二、概要设计
三、详细设计
定义结构表
{
定义表内的所有成员
}[];
( x[])关键字转换为数值
{
求字符数组x每个字符对应的
值的绝对值之和,并返回最后结果
}
( )创建表
{
创建表,并初始化它
}
( d) 按姓名插入
{
以姓名为关键字,调用关键字转换函数将对应的电话号码存储到相应的存储
空间。若该位置已经被存储,则向后移一位(当移到最后一位,就移到头
部继续)。若还有冲突重复上一步。当所有空间都查过一遍,发现没有空位,
则输出“没有存储空间”。
}
( d)按地址插入
{
以地址为关键字,调用关键字转换函数将对应的电话号码存储到相应的存储
空间。若该位置已经被存储,则向后移一位(当移到最后一位,就移到头部
继续)。若还有冲突重复上一步。当所有空间都查过一遍,发现没有空位,则
输出“没有存储空间”。
}
( )表插入
{
输入用户姓名、地址和电话,分别调用按姓名插入和按地址插入函数进行插入。重复上面的步骤,直到你不想继续或空间已满。
}
( )按姓名查找
{
输入你想要查询的姓名,对它进行转换,再查找。若该位置不空或求得的关键字所对应的数值与该位置的数值不相等,则向后移一位(当移到最后一位,就移
数据结构课程设计-利用散列表做一个电话号码查找系统
数据结构课程设计-利⽤散列表做⼀个电话号码查找系统【基本要求】
(1)设每个记录有下列数据项:电话号码、⽤户名、地址;
(2)从键盘输⼊各记录,分别以电话号码和⽤户名为关键字建⽴散列表;
(3)采⽤⼀定的⽅法解决冲突;
(4)查找并显⽰给定电话号码的记录;
(5)查找并显⽰给定⽤户名的记录。
【选做内容】
(1)系统功能的完善;
(2)设计不同的散列函数,⽐较冲突率;
(3)在散列函数确定的前提下,尝试各种不同类型处理冲突的⽅法,考察平均查找长度的变化。
⽤的C++开发,基本实现了3种哈希函数+3种解决冲突的⽅法。因为要求同时有姓名散列与按号码散列,所以⽤了
flag标记每次的散列类型,针对不同的要求对散列函数做了个别优化。
哈希表类的结构如下
1class HashTable{
2public:
3 HashTable(int size = MAXSIZE-1);
4 ~HashTable(){ delete[]E; delete[]tag; delete[]E2; delete[]tag2; }
5int hash1(string name, int flag);//哈希函数1 除数求余法
6int hash2(string tel);//哈希函数2 折叠法
7int hash3(string tel);//哈希函数3 数字分析法
8int solve1(int hashVal, int flag);//线性探测法解决冲突
9int solve2(int hashVal, int flag);//⼆次探测法解决冲突
10 Node* solve3(int hashVal, int flag);//拉链法解决冲突
设计哈希表实现电话号码查询系统
实验五哈希表
一、实验目的:
设计哈希表实现电话号码查询系统。基本要求:
1、设每个记录有下列数据项:电话号码、用户名、地址;
2、从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表;
3、采用再哈希法解决冲突;
4、查找并显示给定电话号码的记录;
5、查找并显示给定用户名的记录。
二、思路:
利用哈希表记录:电话号码、用户名、地址。通过判断来进行相关的增加记录、查询记录、姓名号码排列、清空、退出等操作。
三、结构体定义:
struct node
{
char n ame[8],address[20];
char nu m[11]; node * n ext;
};
typedef no de* pno de;
typedef no de* min gzi;
node **ph one;
node **n am;
node *a;
四、流程图:
1=1添加I=2查询I=3姓名I=4号码I=5清空1=6
退出
返回判断i
五、代码: //#include "iostream.h" #include <iostream> #include "string.h" #include "fstream"
#define NULL 0 unsigned int key; unsigned int key2; int *p;
struct node
{
char name[8],address[20]; char num[11];
node * next;
};
typedef node* pnode; typedef node* mingzi; node **phone;
哈希表实现通讯录-数据结构与算法课程设计报告
合肥学院
计算机科学与技术系
课程设计报告
2009~2010学年第二学期
课程数据结构与算法
课程设计名称哈希表实现通讯录
题目:(哈希表的设计与实现的问题)
设计哈希表实现电话号码查询系统。设计程序完成以下要求:(1)设每个记录有下列数据项:电话号码、用户名、地址;(2)从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表;(3)采用再哈希法解决冲突;(4)查找并显示给定电话号码的记录;(5)查找并显示给定用户的记录。
一、问题分析和任务定义
此程序需要完成如下要求:设计哈希表实现电话号码查询系统。
实现本程序需要解决以下几个问题:
(1)设计结点使该结点包括电话号码、用户名、地址。
(2)利用再哈希法解决冲突。
(3)分别以电话号码和用户名为关键字建立哈希表。
(4)实现查找并显示给定电话号码的记录。
(5)查找并显示给定用户的记录。
本问题的关键和难点在于如何解决散列的问题。由于结点的个数无法的知,并且如果采用线性探测法散列算法,删除结点会引起“信息丢失”的问题。所以采用链地址法散列算法。采用拉链法,当出现同义词冲突时,使用链表结构把同义词链接在一起,即同义词的存储地址不是散列表中其他的空地址。
首先,解决的是定义链表结点,在拉链法中,每个结点对应一个链表结点,它由三个域组成,而由于该程序需要分别用电话号码和用户名为关键字建立哈希表,所以该链表结点它是由四个域组成.name[8] 、num[11]和address[20]都是char浮点型,输入输出都只能是浮点型的。
采用拉链法,其中的所有同义词构成一个单链表,再由一个表头结点指向这个单链表的第一个结点。这些表头结点组成一个一维数组,即哈希表。数组元素的下标对应由散列函数求出的散列地址。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
哈希表实现电话号码查询系统
一目的
利用《数据结构》课程的相关知识完成一个具有一定难度的综合设计题目,利用
C/C++语言进行程序设计,并规范地完成课程设计报告。通过课程设计,巩固和加深对线性表、栈、队列、字符串、树、图、查找、排序等理论知识的理解;掌握现实复杂问题的分析建模和解决方法(包括问题描述、系统分析、设计建模、代码实现、结果分析等);提高利用计算机分析解决综合性实际问题的基本能力。
二需求分析
1、程序的功能
1)读取数据
①读取原电话本存储的电话信息。
②读取系统随机新建电话本存储的电话信息。
2)查找信息
①根据电话号码查询用户信息。
②根据姓名查询用户信息。
3)存储信息
查询无记录的结果存入记录文档。
2、输出形式
1)数据文件“old.txt”存放原始电话号码数据。
2)数据文件“new.txt”存放有系统随机生成的电话号码文件。
3)数据文件“out.txt”存放未查找到的电话信息。
4)查找到相关信息时显示姓名、地址、电话号码。
3、初步测试计划
1)从数据文件“old.txt”中读入各项记录,或由系统随机产生各记录,并且把记录保存
到“new.txt”中。
2)分别采用伪随机探测再散列法和再哈希法解决冲突。
3)根据姓名查找时显示给定姓名用户的记录。
4)根据电话号码查找时显示给定电话号码的用户记录。
5)将没有查找的结果保存到结果文件Out.txt中。
6)系统以菜单界面工作,运行界面友好,演示程序以用户和计算机的对话方式进行。三概要设计
1、子函数功能
int Collision_Random(int key,int i)
//伪随机数探量观测再散列法处理冲突
void Init_HashTable_by_name(string name,string phone,string address) //以姓名为关键字建立哈希表
int Collision_Rehash(int key,string str)
//再哈希法处理冲突
void Init_HashTable_by_phone(string name,string phone,string address) //以电话号码为关键字建立哈希表
void Outfile(string name,int key)
//在没有找到时输出未找到的记录,打开文件out.txt并将记录储存在文档中void Outhash(int key)
//输出哈希表中的记录
void Rafile()
//随机生成数据,并将数据保存在new.txt
void Init_HashTable(char*fname,int n)
//建立哈希表
int Search_by_name(string name)
//根据姓名查找哈希表中的记录
int Search_by_phone(string phone)
//根据电话号码查找哈希表中的记录
2、函数调用图
四详细设计
1、主函数流程图
2、“伪随机探测再散列处理冲突”伪代码
若对应位置上已经存在其他数据,则新的关键字=(原关键字+伪随机数)%哈希表长。
若新的位置上也存在其他数据,则用伪随机序列的下一个数求新的关键字,直到找到合适的位置。
3、“再哈希法处理冲突”伪代码
用“折叠法”将电话号码的ASCII码值定义为关键字,分别为前四位、中四位、后三位。
再用“除留余数法”求的新的关键字=原关键字%哈希表长。
4、“以姓名为关键字建立哈希表”伪代码
用“除留余数法”将姓名的ASCII码值定义为关键字。
若对应位置上存在其他数据,则调用伪随机处理冲突,然后将数据存入哈希表。
5、“以电话号码为关键字建立哈希表”伪代码
用“除留余数法”将电话号码的ASCII码值定义为关键字。
若对应位置上存在其他数据,则调用再哈希处理冲突。
然后将数据存入哈希表。
五调试分析
1、程序的关键是掌握文件的相关操作、哈希函数的创建和运用、伪随机法处理冲突、再哈希法处理冲突等。在编程的过程中,出现了很多问题,如文件无法正常打开、程序进入死循环、无法实现文件的写入操作、忘了添加头文件等错误。修改后程序运行正确。
2、创建“new.txt”内容用子函数来实现,但是原数据是从“old.txt”文件中读取的,刚开始不知道怎样实现二者之间的选择,在同学和参考书的帮助下终于得到解决。
3、关于伪随机和再哈希的相关内容觉得很难懂,看了很久参考书才有所了解
六测试结果
1、根据姓名查找
1)姓名查找成功
2)姓名查找失败
3)哈希表
2、根据电话号码查找
1)电话号码输入错误
2)电话号码查询成功
3)电话号码查询失败
4)哈希表
七用户使用说明
1、选择数据来源
根据提示信息进行操作,选择已存在的“old.txt”文件中的数据或系统当前自动生成的“new.txt”文件。
2、选择查找方式
根据提示信息进行操作,选择“根据姓名查找”或“根据电话号码查找”两种查找方式。
3、选择功能
根据提示信息进行操作,选择输入已知信息或查看哈希表。
4、显示结果
5、查看文件