哈希表的设计与实现 课程设计报告

合集下载

哈希表的设计与实现

哈希表的设计与实现

令胆嗲院

计算机科嗲b练水系

课程设计报告

2007 2008 学年第 2 学期

课程数据结构与算法

课程设计名称哈希表的设计与实现

学生姓名

学号0604011026

专业班级06计科(1)

指导教师

2008 年9 月

课程设计题目:

(哈希表的设计与实现的问题〉设计哈希表实现电话号码查询系统。设计程序完成以下要

求:(1)设每个记录有下列数据项:电话号码、用户名、地址:(2)从键盘输入各记录,分别以电话号码和用户名为关键字建立晗希表;(3)采用再哈希法解决冲突;(4)查找并显示

给定电话号码的记录:(5)查找并显示给定用户的记录。

一、问题分析和任务定义

1、问题分析

要完成如下要求:设计晗希表实现电话号码查询系统。实现本程序需要解决以下几个问题:

(1) 如何设计一个结点使该结点包括电话号码、用户名、地址。

(2) 如何分别以电话号码和用户名为关键字建立哈希表。

(3) 如何利用再晗希法解决冲突。

(4) 如何实现用晗希法查找并显示给定电话号码的记录。

(5) 如何查找并显示给定用户的记录。

2、任务定义

由问题分析知,本设计主要要求分别以电话号码和用户名为关键字建立晗希表,并实现查找功能。所以本设计的核心问题是如何解决散列的问题,亦即设计一个良好的哈希表。由于结点的个数无法确认,并且如果采用线性探测法散列算法,删除结点会引起“信息丢失”的问题。所以采用链地址法散列算法。采用链地址法,当出现同义词冲突时,使用链表结构把同义词链接在一起,即同义词的存储地址不是散列表中其他的空地址。

决的是定义链表结点,在链地址法中,每个结点对应一个链表结点,它由三个首先,解

哈希表课程设计报告

哈希表课程设计报告

哈希表设计

1 需求分析

1.1 针对某个集体中的人名设计一个哈希表,使得平均查找长度不超过R,完成相应的建

立和查表程序.

1.2 人名为汉语拼音形式,最长不超过18个字符(如:庄双双 zhuangshuangshuang).

1.3 假设待填入哈希表的人名有30个,平均查找长度为2。哈希表用除留余数法构造,

用伪随机探测在散列法处理冲突。

1.4 在输入人名过程中能自动识别非法输入,并给与非法输入的反馈信息要求重新输入。

1.5 测试数据:

1)输入数据:zhangyun,mochengcheng,geyuwei,zhouruifeng,yuanyan,mengxiangyin, wuxudong,chenghusheng,wangqi,zhangxiuhua,xiongliying,leiyang,hanbingfeng, zhangchao,yaoboyu,liyingtao,liutong,wangyingli,lixiang,lvxiaohu,huanglei, zhouxiong,zhangxinxin,hexuyang,linyoulu,zhangxiao,chenzhi,dongchaoxun, wangxinyu,yuman,zhangyao.(在输入是可以输入非法数据来检验如:12345,

zhuang shuangshuang,$%&^&*等等)

2)查找输入:zhuangyuan 输出:查找成功

输入:zhuangshuangshuang 输出:查找失败

输入:mochengcheng 输出:查找成功

数据结构-哈希表设计实验报告

数据结构-哈希表设计实验报告

//头文件main.c

#include<stdio.h>

#include<stdlib.h>

struct keyNum* hash[100];

struct keyNum* insertHash(struct keyNum*,int);//关键字插入链表

int searchHash(struct keyNum*,int m);//查找链表中是否存在值为m的整数void print(struct keyNum*);//打印链表

struct keyNum

{

int key;//关键字

struct keyNum *next;

};

void main()

{

int i,k,m,n,num,flag,l,j;

int a[] = {280,700,603,430,641,907,640};

struct keyNum *head = NULL;

num = sizeof(a)/sizeof(int);

for(i=0;i<sizeof(a)/sizeof(int);i++)

{

k = a[i];

m=k%(num+1);//计算得到关键字的哈希值

hash[m]=insertHash(hash[m],k);//将关键字k插入到哈希值为m的链表中

}

printf("采用链地址法得到的哈希表为:\n");

for(i=0;i<num+1;i++)

{

printf("第%d行:",i);

print(hash[i]);

printf("\n");

}

printf("请输入要查找的整数值:\n");

哈希实验报告

哈希实验报告

引言概述:

本文旨在对哈希实验进行报告,重点介绍哈希实验的二次探测法、哈希函数、哈希表的查找、插入与删除操作,并分析实验结果。通过本实验的开展,我们对哈希算法的原理、实现和性能有了更深入的理解,也增加了对数据结构的实践能力。

正文内容:

一、二次探测法

1.定义与原理

2.步骤与流程

3.优缺点分析

4.实验过程与结果

5.实验中的注意事项

二、哈希函数

1.哈希函数的设计原则

2.常见的哈希函数算法

3.哈希冲突与解决方法

4.哈希函数的优化策略

5.实验中的哈希函数选择与应用

三、哈希表的查找操作

1.哈希表的存储结构与基本操作

2.直接定址法查找

3.拉链法查找

4.其他查找方法与比较

5.实验结果与分析

四、哈希表的插入与删除操作

1.插入操作的实现思路

2.插入操作的效率分析

3.删除操作的实现思路

4.删除操作的效率分析

5.实验结果分析与对比

五、实验结果与总结

1.实验数据的统计与分析

2.实验中的问题与解决方案

3.实验结论与总结

4.对哈希算法的进一步探讨与应用展望

5.实验的意义与启示

总结:

通过对哈希实验的详细阐述,我们对二次探测法、哈希函数、哈希表的查找、插入与删除操作有了更深入的了解。实验结果与分析表明,在哈希表的实现中,选择合适的哈希函数、解决哈希冲突以及优化插入与删除操作,对提高哈希表的性能至关重要。哈希算法作为一种重要的数据结构应用,具有广泛的应用前景,在实际问题中具有重要的实践意义。通过本次实验,我们不仅提升了对数据结构的理论理解,也增强了数据结构算法的实践能力,为今后的学习与研究打下了坚实的基础。

哈希表实验报告

哈希表实验报告

实习报告

题目:设计一个哈希表,完成相应的建表和查表程序

一、班级:1503013 姓名:李睿元学号:完成日期:需求分析

1. 假设人名为中国人名的汉语拼音形式;

2. 待填入哈希表的姓名共有30个,去平均查找长度的上限为2;

3. 哈希函数用除留余数法构造,用伪随机探测再散列法处理冲突;

4. 取读者周围较熟悉的30个人的姓名。

二、概要设计

1. 抽象数据类型的定义:

(1)人名数据表:

typedef struct Node

{

char name[20];

int key;

}Node,NodeList[MAX];

(2)哈希表:

typedef struct hashtable

{

char* name;

int key;

int conflict_time;

}HashTable[hashlen];

(3)变量:

#define P 61主要函数的实现:

(1)哈希函数:

int Hash(int key)

(2)关键字获得:

int GetKey(char str[])

(3)文件流中读取姓名:

void GetName(NodeList &L,int i,FILE* fp)

(4)哈希表的初始化:

void InitialHashTable(HashTable &ht)

(5)伪随机探测序列的生成:

void CreatConfilctArray(int n[])

(6)哈希表的生成:

void CreatHashTable(HashTable &ht,NodeList L,int* n)

(7)哈希表的查询:

void SearchHashTable(HashTable ht,int* n,char get_name[])三、详细设计

课程设计报告-哈希表

课程设计报告-哈希表

(此文档为word格式,下载后您可任意编辑修改!) 数据结构课程设计

(哈希表的设计)

院系

专业

班级

学生姓名

学号

课程设计日期:2011年6月26日至2011年7 月7 日

目录

一、问题描述 (3)

二、需求分析

1、基本要求 (3)

2、测试数据 (3)

三、概要设计 (3)

四、详细设计 (4)

五、测试分析 (11)

六、课程设计总结 (13)

七、附录(源代码) (14)

一、问题描述

针对自己班级体中的“人名”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序。

二、需求分析

基本要求:

假设人名为中国姓名的汉语拼音模式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数用除留余数法构造,用链表法处理冲突。

测试数据:

输入30个人的姓名拼音,即30个字符串,然后用除留余数法构建哈希表并用链表法处理冲突,最后将结果输出,程序自动计算查找长度的总数和平均查找长度,然后用户可以根据需求进行查找操作。

三、概要设计

四、详细设计

头文件

#include <stdio. 30 *哈希表长度*

int sum=0,k=0;

typedef struct Node*哈希表结构体*

{

char key_code[10];*哈希表地址*

struct Node *next;

}Node;

typedef struct mode;

}

void Hash_Init(HashTable str[0]+str[1]+str[2]; }

int Hash_Insert(HashTable 1;

}

Node* Hash_Search(HashTable NULL;} else if( p;

数据结构课程设计

数据结构课程设计

数据结构课程设计报告

题目:哈希表的设计与实现

一、绪论

1、课题:

哈希表的设计与实现。

2、课题描述:

设计哈希表实现电话号码查找系统。

3、基本功能:

1)设每个记录有下列数据项:电话号码、用户名、地址;

2)从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表;

3)查找并显示给定电话号码的记录;

4)查找并显示给定用户名的记录。

二、设计方案

1.数据结构的选择与设计

本项目的设计算法采用的是哈希表。该数据结构的类的定义设计如下:

struct node //建节点

{

char name[8];//名字

char address[20];//地址

char num[11];//手机号

node * next;//到邻接站点的指针

};

2、总体设计方案

首先,构建模型,初始化数据;其次,为所需功能设计算法并实现;最后,设计界面,完善系统的人机交互功能。

3、详细设计方案

(1)算法设计

由于最终只需要从姓名和号码查找,所以需要建立两个哈希函数。void hash(char num[11]) //哈希函数(号码){

int i = 3;

key=(int)num[2];

while(num[i]!=NULL)

{

key+=(int)num[i];

i++;

}

key=key%20;

}

void hash2(char name[8]) //哈希函数(姓名){

int i = 1;

key2=(int)name[0];

while(name[i]!=NULL)

{

key2+=(int)name[i];

}

key2=key2%20;

}

然后,由于是电话簿,既然要查找,就得先输入以及保存,所以需要建立输入函数和保存函数。

数据结构课程设计哈希表实验报告

数据结构课程设计哈希表实验报告

数据结构课程设计哈希表实验报告

数据结构课程设计哈希表实验报告

福建工程学院

课程设计

课程:算法与数据结构

题目:哈希表

专业:网络工程

班级: xxxxxx班

座号: xxxxxxxxxxxx

姓名: xxxxxxx

12 月 31 日

实验题目:哈希表

一、要解决的问题

针对同班同学信息设计一个通讯录,学生信息有姓名,学号,电话号码等。以学生姓名为关键字设计哈希表,并完成相应的建表和查表程序。

基本要求:姓名以汉语拼音形式,待填入哈希表的人名约30个,自行设计哈希函数,用线性探测再散列法或链地址法处理冲突;在查找的过程中给出比较的次数。完成按姓名查询的操作。

运行的环境:Microsoft Visual C++ 6.0

二、算法基本思想描述

设计一个哈希表(哈希表内的元素为自定义的结构体)用来存放待填入的30个人名,人名为中国姓名的汉语拼音形式,用除留余数法构造哈希函数,用线性探查法解决哈希冲突。建立哈希表而且将其显示出来。经过要查找的关键字用哈希函数计算出相应的地址来查找人名。经过循环语句调用数组中保存的数据来显示哈希表。

三、设计

1、数据结构的设计和说明

(1)结构体的定义

typedef struct //记录

NA name;

NA xuehao;

NA tel;

}Record;

录入信息结构体的定义,包含姓名,学号,电话号码。

typedef struct //哈希表

{

Record *elem[HASHSIZE]; //数据元素存储基址

int count; //当前数据元素个数

int size; //当前容量

}HashTable;

哈希表—课程设计

哈希表—课程设计

成绩

南京工程学院

课程设计说明书

(论文)

题目哈希表的设计与性能分析

课程名称数据结构

院(系、部、中心)通信工程学院

专业信息工程

班级 K信息091

学生姓名翟珂

学号 240092610

设计地点信息楼C213

指导教师吴海涛

设计起止时间:2011年8月29日至2011年9 月9 日

目录

1.功能描述(或设计目标)

2.总体设计(或概要设计)

2.1数据结构描述与定义

2.2模块设计

3.测试结果与分析 (8)

4.课程设计总结 (9)

参考文献: (10)

附录: (11)

1.功能描述(或设计目标)

哈希表的设计与性能分析

要求:(1)数据结构的定义

(2)哈希表中,哈希函数构造方法多种多样,同时对于同一哈希函数解决冲突的方法也可以不同。两者是影响查询算法性能的关键因素。对于几

种典型的哈希函数构造方法,做实验观察,不同的解决冲突方法对查询

性能的影响(平均查找长度).

 处理冲突的实际含义是:为产生冲突的地址寻找下一个哈希地址。

(1)开放定址法

为产生冲突的地址H(key)求得一个地址序列:

H0, H1, H2, …, Hs 1≤s≤m-1

其中:H0 = H(key)

Hi = ( H(key) + di ) MOD m i=1, 2, …,s

(2)链地址法

将所有哈希地址相同的记录都链接在同一链表中。

线性探测容易产生二次聚集,链地址肯定不会产生二次聚集。一次聚集

的产生主要取决于哈希函数,在哈希函数均匀的前提下,可以认为没有

一次聚集。 

2.总体设计(或概要设计)

第 3 页共18 页

2.1数据结构描述与定义

除数余留法

数据结构专业课程设计哈希表实验报告样本

数据结构专业课程设计哈希表实验报告样本

数据结构专业课程设计哈希表实验报告

福建工程学院课程设计

课程:算法与数据结构

题目:哈希表

专业:网络工程

班级:xxxxxx班

座号:xxxxxxxxxxxx

姓名:xxxxxxx

2011年12 月31 日

实验题目:哈希表

一、要解决的问题

针对同班同学信息设计一个通讯录,学生信息有姓名,学号,电话号码等。以学生姓名为关键字设计哈希表,并完成相应的建表和查表程序。

基本要求:姓名以汉语拼音形式,待填入哈希表的人名约30个,自行设计哈希函数,用线性探测再散列法或链地址法处理冲突;在查找的过程中给出比较的次数。完成按姓名查询的操作。

运行的环境:Microsoft Visual C++

二、算法基本思想描述

设计一个哈希表(哈希表内的元素为自定义的结构体)用来存放待填入的30个人名,人名为中国姓名的汉语拼音形式,用除留余数法构造哈希函数,用线性探查法解决哈希冲突。建立哈希表并且将其显示出来。通过要查找的关键字用哈希函数计算出相应的地址来查找人名。通过循环

语句调用数组中保存的数据来显示哈希表。

三、设计

1、数据结构的设计和说明

(1)结构体的定义

typedef struct //记录

{

NA name;

NA xuehao;

NA tel;

}Record;

录入信息结构体的定义,包含姓名,学号,电话号码。

typedef struct //哈希表

{

Record *elem[HASHSIZE]; //数据元素存储基址

int count; //当前数据元素个数

int size; //当前容量

}HashTable;

哈希表元素的定义,包含数据元素存储基址、数据元素个数、当前容量。

哈希表实现通讯录-数据结构与算法课程设计报告

哈希表实现通讯录-数据结构与算法课程设计报告

合肥学院

计算机科学与技术系

课程设计报告

2009~2010学年第二学期

课程数据结构与算法

课程设计名称哈希表实现通讯录

题目:(哈希表的设计与实现的问题)

设计哈希表实现电话号码查询系统。设计程序完成以下要求:(1)设每个记录有下列数据项:电话号码、用户名、地址;(2)从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表;(3)采用再哈希法解决冲突;(4)查找并显示给定电话号码的记录;(5)查找并显示给定用户的记录。

一、问题分析和任务定义

此程序需要完成如下要求:设计哈希表实现电话号码查询系统。

实现本程序需要解决以下几个问题:

(1)设计结点使该结点包括电话号码、用户名、地址。

(2)利用再哈希法解决冲突。

(3)分别以电话号码和用户名为关键字建立哈希表。

(4)实现查找并显示给定电话号码的记录。

(5)查找并显示给定用户的记录。

本问题的关键和难点在于如何解决散列的问题。由于结点的个数无法的知,并且如果采用线性探测法散列算法,删除结点会引起“信息丢失”的问题。所以采用链地址法散列算法。采用拉链法,当出现同义词冲突时,使用链表结构把同义词链接在一起,即同义词的存储地址不是散列表中其他的空地址。

首先,解决的是定义链表结点,在拉链法中,每个结点对应一个链表结点,它由三个域组成,而由于该程序需要分别用电话号码和用户名为关键字建立哈希表,所以该链表结点它是由四个域组成.name[8] 、num[11]和address[20]都是char浮点型,输入输出都只能是浮点型的。

采用拉链法,其中的所有同义词构成一个单链表,再由一个表头结点指向这个单链表的第一个结点。这些表头结点组成一个一维数组,即哈希表。数组元素的下标对应由散列函数求出的散列地址。

《哈希表》课程设计报告

《哈希表》课程设计报告

《哈希表》课程设计报告

数据结构散列表(哈希表)课程设计报告及源代码

《哈希表的操作》设计报告

一目的

通过此次课程设计,让学生充分掌握对哈希表的有关操作,例如除留余数法的运用,处理冲突的三个办法:线性探测再散列,二次探测再散列,连地址法等。加深学生对于哈希表这种独特存储方式(区别于线性存储和链式存储)的理解,和几种算法之间的优越性的体会。

二需求分析

1、功能需求

①.用户能够自定义输入单词,存入哈希表里;

②.用户能够对当前哈希表进行管理。操作内容包括:查看当前哈希表、搜索某个单词、插入任意单词、删除表中某个单词、查看当前表的平均搜索长度、置空当前哈希表。

③.程序有良好的交互界面,有操作提示和出错提示,方便用户使用和进出入程序。

2、程序约束

①.哈希表的散列方法为除留余数法,处理冲突的办法为线性探测在散列。②.使用C/C++语言编写,程序模块化设计。

三概要设计

1、模块设计

程序分为主程序模块和哈希表类定义模块,主程序存放在main.app中,哈希表类存放在HashTable.h头文件中。

①.主程序模块

用于数据和DOS用户界面的初始化,主函数mai()内部定义子函数function(),调用哈希表类中的各个功能函数。

②.哈希表类定义

Calculate(string s) 单词key值计算函数,类友元

形参s传送输入的单词。由于单词为string型,不方便直接拿来参与取余数计算,

故用计算函数求出一个key来,同时可以减少冲突(字母相同的单词key有可能不同)。

FindPos(int key,string value) 地址查找函数,类成员

哈希表实验报告完整版

哈希表实验报告完整版

实验报告

姓名:学号:

1.实验题目

针对某个集体中人名设计一个哈希表,使得平均查找长度不超过R,并完成相应的建表和查表程序。

基本要求:假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数用除留余数法构造,用线性探测再散列法或链地址法处理冲突。

2.需求分析

本演示程序用VC编写,完成哈希函数用除留余数法构造,用线性探测再散列法或链地址法处理冲突。

输出形式:地址,关键字,收索长度,H(key),拼音

3.概要设计

typedef struct NAME

typedef struct hterm

void InitNameList()

void CreateHashList()

void FindList()

void Display()

int main()

4.详细设计

#include <stdio.h>

#include<malloc.h>

#include<string.h>

#define HASH_LEN 50

#define M 47

#define NAME_NO 8

typedef struct NAME

{

char *py; //名字的拼音

int k; //拼音所对应的整数}NAME;

NAME NameList[HASH_LEN];

typedef struct hterm //哈希表{

char *py; //名字的拼音

int k; //拼音所对应的整数int si; //查找长度

}HASH;

HASH HashList[HASH_LEN];

哈希表设计-数据结构课程设计

哈希表设计-数据结构课程设计

针对某个集体(比如你所在的班级)中的“人名”设计一个哈希表,使得平均查找长度 均不超过 R ,完成相应的建表和查表顺序。

假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有30 个,取平均查找 长度的上限为 2 。哈希函数用除留余数法构造,用伪随机探测再散列法处理冲突。

取读者周围较熟悉的 30 个人的姓名。

如果随机数自行构造, 则应首先调整好随机函数, 使其分布均匀。 人名的长度均不超过 19 个字符(最长的人名如:庄双双(Zhuang Shuangshuang ))。字符的取码方法可直接利用

ADT Hash {

数据对象 D :D 是具有相同特征的数据元素的集合。各数据元素均含有类型相同,可唯

一标识数据元素的关键字。

数据关系 R :数据元素同属一个集合。 InitNameTable()

操作结果:初始化姓名表。 CreateHashTable()

操作结果:建立哈希表。 DisplayNameTable()

操作结果:显示姓名表。 DisplayHashTable()

操作结果:显示哈希表。 FindName()

操作结果:查找姓名。

(使用 C 语言) #include<stdio.h>

#include<time.h>//time 用到的头文件 #include<stdlib.h>//随机数用到的头文件 #include<ctype.h>//toascii()用到的头文件

#include<string.h>//查找姓名时比较用的头文件 #define HASH_LEN 50//哈希表的长度 #define P 47//小于哈希表长度的 P #define NAME_LEN 30//姓名表的长度

哈希表的设计与实现课程设计报告

哈希表的设计与实现课程设计报告

一: 需求分析 (2)

三: 详细设计(含代码分析) (4)

1. 程序描述: (4)

2 具体步骤 (4)

四调试分析和测试结果 (7)

五,总结 (10)

六. 参考文献; (11)

七. 致谢 (11)

八.附录 (11)

: 需求分析问

题描述:设计

哈希表实现电

话号码查询系

统。

基本要求

1、设每个记录有下列数据项:电话号码、用户名、地址

2、从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希

表;

3、采用再哈希法解决冲突;

4、查找并显示给定电话号码的记录;

5、查找并显示给定用户名的记录。

6、在哈希函数确定的前提下,尝试各种不同类型处理冲突的方法(至

少两种),考察平均查找长度的变化。

概要设计

进入主函数,用户输入1或者2,进入分支选择结构:选1:以链式方法建立哈希表, 选2: 以再哈希的方法建立哈希表, 然后用户输入

用户信息, 分别以上述确定的方法分别以用户名为检索以及以以电话

号码为检索将用户信息添加到哈希表,. 当添加一定量的用户信息后, 用户接着输入用户名或者电话号码分别以用户名或者电话号码的方式从以用户名或电话号码为检索的哈希表查找用户信息. 程序用链表的方式存储信息以及构造哈希表。

具体流程图如下所示

程序结束

详细设计(含代码分析)

1. 程序描述 :

本程序以要求使用哈希表为工具快速快速查询学生信息,学生信息包括电话号 码、用户名、地址;用结构体存储

struct node

{ string phone; //

string name; //

string address;//

node *next; //

哈希表设计与实现数据结构课程设计

哈希表设计与实现数据结构课程设计

课程名称:数据结构

XXXXXXXX

本科学生课程设计(论文)

题目哈希表的设计与实现

姓名 XXX

学号 XXXXXXXXXXXX

学部计算机科学与技术

专业、年级计算机科学与技术大二

指导教师 XX

2010 年 11月 28日

摘要

随着信息技术的发展,关于各种程序中的数据结构也是层出不穷,对于项目某一方面的计算或者是某一方面的研究,出现了专门的数据结构,哈希表就是其中之一,哈希表作为另类的一种数据结构,其作用也是区别于其它同类的数据结构的,它是由两部分组成的:键(key)和值,通过键可以迅速的查找到你需要的值。常见的构造哈希函数的方法有直接定址法除留余数法平方取中法数字分析法等。一般创建哈希表时可能会出现很多的冲突,常用的处理冲突的方法为开放定址法再哈希法链地址法建立一个公共溢出区。

关键词: 数据结构;哈希表;键(key);

目录

第1章前言与系统实现 ____________________________________________ 4 1.1前言__________________________________________________________ 4 1.2系统实现______________________________________________________ 5

1.2.1 开发环境_________________________________________________ 5

1.2.2 Visual C++环境的安装_____________________________________ 5 第2章系统功能分析_______________________________________________ 6 2.1 系统功能需求分析 ____________________________________________ 6 2.2 任务定义 ____________________________________________________ 6 第3章总体设计___________________________________________________ 7 3.1系统数据结构__________________________________________________ 7 3.2主要算法流程图________________________________________________ 8

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一: 需求分析 (2)

三: 详细设计(含代码分析) (4)

1.程序描述: (4)

2具体步骤 (4)

四调试分析和测试结果 (7)

五,总结 (9)

六.参考文献; (10)

七.致谢 (10)

八.附录 (11)

一: 需求分析

问题描述:设计哈希表实现电话号码查询系统。

基本要求

1、设每个记录有下列数据项:电话号码、用户名、地址

2、从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表;

3、采用再哈希法解决冲突;

4、查找并显示给定电话号码的记录;

5、查找并显示给定用户名的记录。

6、在哈希函数确定的前提下,尝试各种不同类型处理冲突的方法(至少

两种),考察平均查找长度的变化。

二: 概要设计

进入主函数,用户输入1或者2,进入分支选择结构:选1:以链式方法建立哈希表,选2:以再哈希的方法建立哈希表,然后用户输入用户信息,分别以上述确定的方法分别以用户名为检索以及以以电话号码为检索将用户信息添加到哈希表,.当添加一定量的用户信息后,用户接着输入用户名或者电话号码分别以用户名或者电话号码的方式从以用户名或电话号码为检索的哈希表查找用户信息.程序用链表的方式存储信息以及构造哈希表。

具体流程图如下所示:

三: 详细设计(含代码分析)

1.程序描述:

本程序以要求使用哈希表为工具快速快速查询学生信息,学生信息包括电话号码、用户名、地址;用结构体存储

struct node

{ string phone; //电话号码

string name; //姓名

string address;//地址

node *next; //链接下一个地址的指针

};

2具体步骤

1. 要求主要用在哈希法解决冲突,并且至少尝试用两种方法解决冲突,定义两个指针数组存储信息node *infor_phone[MAX]; node *infor_name[MAX];前者以电话号码为关键字检索哈希表中的信息,后者以姓名为关键字检索哈希表中的信息

用链式法和再哈希法解决冲突:

int hash(string key) //以姓名或者电话号码的前四位运算结果作为哈{ //希码

int result=1,cur=0,i;

if(key.size()<=4)

i=key.size()-1;

else i=4;

for(;i>=0;i--)

{

cur=key[i]-'0';

result=result*9+cur;

}

result%=(MOD);

return result;

}

2.得到输入信息的哈希码以后,将相应的信息插入对应的地址,若产生冲突,则循环到这个地址的最后一个节点,然后再将节点插入到这个位置,这样就避免了冲突,在查找的时候便可直接找到这个地址然后快速的查找到信息:

void add_infor_phone(string phone,string name,string address)

{

int value=hash(phone);

node *infor=build_infor(phone,name,address);

if(infor_phone[value]==NULL)

infor_phone[value]=infor;

else

{

node *cur=infor_phone[value];

while(cur->next)

cur=cur->next;

cur->next=infor;

}

}

3. 再哈希法也是解决冲突的常见方法,当同义词产生地址冲突时计算另一个哈希函数地址,知道冲突不再发生,这种方法不易产生聚义,但是增加了计算时间:int hash_agin(int numble,int key) //将关键字的前四位数经过计算的结果{ //模上一个定义的数然后返回的数字为 return numble%key; //哈希码

}

int create(string key)

{

int result=1,cur=0,i;

if(key.size()<=4)

i=key.size()-1;

else

i=4;

for(;i>=0;i--)

{

cur=key[i]-'0';

result=result*9+cur;

}

return result;

}

4. 同样用链表为储存信息的数据结构,当产生冲突时,将模数减去一然后再寻找地址直到不再产生冲突:

void add_infors(string phone,string name,string address)

{

int numble_phone=create(phone),key=MOD,pos_phone,pos_name;

while(infor_phone[pos_phone=hash_agin(numble_phone,key)]!=NULL) key--;

key=MOD;

int numble_name=create(name);

while(infor_name[pos_name=hash_agin(numble_name,key)]!=NULL)

key--;

node *inforphone=new node;

node *inforname=new node;

inforphone->name=inforname->name=name;

inforphone->phone=inforname->phone=phone;

inforphone->address=inforname->address=address;

inforphone->next=inforname->next=NULL;

infor_phone[pos_phone]=inforphone;

infor_name[pos_name]=inforname;

}

相关文档
最新文档