哈希表实现电话号码查询系统

合集下载

数据结构之哈希表

数据结构之哈希表

实验目的:

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

设计哈希表建立电话号码查询系统.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版)哈希表实现电话号码查询报告

(完整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版)哈希表实现电话号码查询系统

(完整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语言版(课程设计报告)

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

相关文档
最新文档