(完整word版)哈希表实现电话号码查询系统
设计哈希表建立电话号码查询系统.doc
设计哈希表建立电话号码查询系统一、需求分析1.本演示程序中,输入的形式为一个以“回车符”为标志的字符串和整型数字,其输入值的形式为26个英文字母,并且区分大小写,以及整型数字1~6。
2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”后,由用户在键盘上输入演示程序中规定的运算命令,相应的输入数据和字符以及运算结果显示在其后。
3.程序所能达到的功能:用户输入姓名或者电话号码之后,屏幕上将会显示用户相关的信息,即姓名、电话号码和地址,如果通讯录上没有该用户的相关信息,则会提醒用户记录不存在,并且系统将自动保存该用户的信息。
4.初步测试计划:输入记录中存在的用户姓名,查看输出结果;输入记录中存在的用户电话号码,查看输出结果;输入任意一个姓名,查看输出结果;输入任意一个电话号码,查看输出结果;二、概要设计1.用哈希表建立电话号码查询系统的数据类型定义:struct person{char name[10];char number[14];charaddress[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值相加之和,操作结果返回和值,并且返回值为整型。
void creat_hash1( );以电话号码为关键字建立哈希表,即将电话号码以及姓名和地址全部存入结构体数组p中,操作结果无返回值。
void creat_hash2( );以姓名为关键字建立哈希表,即将姓名以及电话号码和地址全部存入结构体数组p中,操作结果无返回值。
(完整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)//伪随机数探量观测再散列法处理冲突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.txtvoid Init_HashTable(char*fname,int n)//建立哈希表int Search_by_name(string name)//根据姓名查找哈希表中的记录int Search_by_phone(string phone)//根据电话号码查找哈希表中的记录2、函数调用图四详细设计1、主函数流程图2、“伪随机探测再散列处理冲突”伪代码若对应位置上已经存在其他数据,则新的关键字=(原关键字+伪随机数)%哈希表长。
数据结构 手机号码查询系统
报告编号:第5组综合课程设计报告手机号码查询系统指导教师:所在系:电子工程系所学专业:计算机科学与技术年级: 2012级2014 年 6 月目录1、课程设计目的和要求 (1)1.1 设计目的 (1)1.2 设计要求 (1)2、课程设计的主要工作 (1)2.1 需求分析 (1)3、课程基本设计说明 (1)3.1 概要设计和数据结构选择 (1)3.2程序具体设计 (2)3.3 程序流程图 (2)4、程序详细设计 (4)4.1 创建 (4)4.2 对哈希函数的定义 (4)4.3 哈希查找 (5)4.4 主函数 (6)5、程序运行结果界面 (8)6、课程设计总结 (12)7、参考文献 (13)8、附录 (13)摘要本文主要介绍了手机号码查询系统,实现对用户手机号码、用户名以及地址的添加、查询、存储。
程序主要以手机号码和姓名为关键字建立哈希表,并实现查找功能。
其中,以手机号为关键字建立哈希表时采用线性探测法解决冲突、以姓名为关键字建立哈希表时用拉链法解决冲突,成功通过设计哈希表实现对用户的手机号码、姓名、地址显示、查询等功能。
通过课程设计,巩固和加深对结构体、哈希表等理论知识的理解,掌握现实复杂的分析建模和解决方法,掌握包括问题描述、系统分析、设计建模、代码实现、结果分析等的方法;提高利用计算机分析解决综合性实际问题的基本能力;锻炼个人的动手能力,历练自身素质;提高大家的合作能力。
关键字:哈希表线性探测法链地址法1、课程设计目的和要求1.1 设计目的本题目最主要的的是设计散列函数,本程序需要设计两个散列函数才能解决问题,程序需要分别为以号码和用户名为关键字建立哈希表。
所以要分别以用户名、号码为关键字建立两个散列函数。
1.2 设计要求(1)每个记录有下列数据项:手机号码、用户名、地址;(2)从键盘输入各记录,分别以手机号码和用户名为关键字建立哈希表(哈希函数自选);(3)以手机号为关键字建立哈希表时采用线性探测法解决冲突、以姓名为关键字建立哈希表时用拉链法解决冲突;(4)查找并显示给定手机号码的记录;(5)查找并显示给定用户名的记录。
基于散列表的电话号码查询系统 完整版
#include<iostream> //cout,cin语句的头文件#include<stdlib.h> //清屏函数头文件:使用csl时调用system#include<string> //字符串头文件#include<stdio.h>#include<fstream>#define MAXSIZE 100 //电话薄记录的数量#define MAX_SIZE 50 //用户名、电话号码、地址的最大长度#define HASHSIZE 400 //定义表长#define SUCCESS 1 //查找#define UNSUCCESS -1#define LEN sizeof(HashTable) // 哈希表的长度using namespace std;typedef int Status;//typedef用来定义类型的别名。
此处用status作为int别名,目的表达int 变量是一个状态变量。
typedef char NA[MAX_SIZE]; //NA作为char的别名typedef struct{ // 自定义一个记录用户名、电话号码、联系地址的结构体的别名recordNA name,tel,add,way;}Record;Record a[HASHSIZE];typedef struct{ //散列表Record *elem[HASHSIZE]; //数据元素存储地址int count; //数据元素个数int size; //容量}HashTable;Status eq(NA x,NA y){ //关键字比较,相等返回SUCCESS;否则返回UNSUCCESSif(strcmp(x,y)==0)//2个字符串的大小比较s1=s2,strcmp(s1,s2) == 0; s1>s2, strcmp(s1,s2) == 1; s1<s2, strcmp(s1,s2) == -1;return SUCCESS;elsereturn UNSUCCESS;}Status NUM_BER; //记录的个数void getin(Record* a){ // 键盘输入联系人的信息,Record*调用Record函数;a是参数cout<<"请输入要添加的联系人的个数:\n";cin>>NUM_BER;int i;for(i=0;i<NUM_BER;i++){cout<<"请输入第"<<i+1<<"个记录的用户名:\n";cin>>a[i].name;cout<<"请输入第"<<i+1<<"个记录的电话号码:\n";cin>>a[i].tel;cout<<"请输入第"<<i+1<<"个记录的地址:\n";cin>>a[i].add;}}void ShowInformation(Record* a)//显示输入的用户信息{int i;for( i=0;i<NUM_BER;i++)cout<<"\n第"<<i+1<<"个用户信息:\n 姓名:"<<a[i].name<<"\n 电话号码:"<<a[i].tel<<"\n 联系地址:"<<a[i].add<<"\n--------\n";}long fold(NA s) //人名的折叠处理:将关键字分割成位数相同的几部分,最后一部分位数可以不同,然后取这几部分的叠加和(去除进位)作为散列地址{char *p;long sum=0;NA ss;strcpy(ss,s);//复制字符串,不改变原字符串的大小写strupr(ss);//将字符串ss转换为大写形式p=ss;while(*p!='\0')sum+=*p++;return sum;}int Hash1(NA str){//哈希函数long n;int m;n=fold(str);//先将用户名进行折叠处理m=n%HASHSIZE; //折叠处理后的数,用除留余数法构造哈希函数return m; //并返回模值}int Hash2(NA str){//哈希函数long n;int m;n = atoi(str);//把字符串转换成整型数.m=n%HASHSIZE; //用除留余数法构造哈希函数return m; //并返回模值}Status collision(int p,int &c){ // 冲突处理函数,采用二次探测再散列法解决冲突int i,q;i=c/2+1;while( i < HASHSIZE ){if(c%2==0){c++;q=(p+i*i)%HASHSIZE;if(q>=0) return q;else i=c/2+1;}else{q=(p-i*i)%HASHSIZE;c++;if(q>=0) return q;else i=c/2+1;}}return UNSUCCESS;}int searchHash( HashTable * &H, NA key, int &p, int &c ,int way ){if( way == 1 ){p=Hash1( key );while(H->elem[p]!=NULL && !eq( key, H->elem[p]->name ) )//若哈希地址冲突,进行冲突处理collision( p ,++c );if( eq( key, H->elem[p]->name ) )return 1;elsereturn 0;}else{p=Hash2( key );while(H->elem[p]!=NULL && !eq( key, H->elem[p]->tel ) )//若哈希地址冲突,进行冲突处理collision( p ,++c );if( eq( key, H->elem[p]->tel ) )return 1;elsereturn 0;}}// 建表,若哈希地址冲突,进行冲突处理void CreateHash(HashTable* H ,Record* a){cout<<"\n 〓〓〓〓〓〓建立散列表〓〓〓〓〓〓〓";cout<<"\n ⑴. 以姓名建立散列表(再散列法解决冲突) ";cout<<"\n ⑵. 以电话号码建立散列表(再散列法解决冲突) ";cout<<"\n ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆";cout<<"请输入选择:";int num,i,p=-1,c;cin>>num;for(i=0;i<NUM_BER;i++){c=0;if( num==1 ){p=Hash1( a[i].name );while(H->elem[p]!=NULL && !eq( a[i].name, H->elem[p]->name ) )//若哈希地址冲突,进行冲突处理collision( p ,++c );}else{p=Hash2( a[i].tel );while(H->elem[p]!=NULL && !eq( a[i].tel, H->elem[p]->tel ) )//若哈希地址冲突,进行冲突处理collision( p ,++c );}H->elem[p]=a+i; //求得哈希地址,将信息存入H->count++;cout<<"第"<<i+1<<"个记录冲突次数为"<<c<<"。
实验五 电话号码查询系统的实现 实验代码及截图
电话号码查询系统的实现实验代码及截图#include"stdio.h"#include"malloc.h"#include"string.h"#include"stdlib.h"typedef struct node{char name[14];char tel1[15];char tel2[15];struct node *link;}LNode,*LinkList;LinkList Book_Creat(LinkList list){LinkList p,r,q;p=(LinkList)malloc(sizeof(LNode));printf("\n姓名:");scanf("%s",p->name);printf("TEL1:");scanf("%s",p->tel1);printf("TEL2:");scanf("%s",p->tel2);printf("\n");p->link=NULL;if(list==NULL || strcmp(p->name,list->name)<0) {p->link=list;list=p;}else{q=list;while(q!=NULL && strcmp(q->name,p->name)<0) { r=q;q=q->link;}p->link=q;r->link=p;}printf("联系人新建完毕!\n");return list;}LinkList Book_Print(LinkList list){LinkList q=list;while(q){printf("姓名:%s\t",q->name);printf("TEL1:%s\t",q->tel1);printf("TEL2:%s\t\n",q->tel2);q=q->link;}return list;}Book_Search(LinkList list){LinkList q=list,p;p=(LinkList)malloc(sizeof(LNode)); printf("请输入要查找的姓名:");scanf("%s",p->name);while(q!=NULL){if(strcmp(q->name,p->name)!=0) q=q->link;else{printf("\n姓名:%s\n",q->name); printf("TEL1:%s\n",q->tel1); printf("TEL2:%s\n",q->tel2); printf("\n");return 0;}if(q==NULL){printf("本系统中没有找到此人!\n"); }}return 0;}LinkList Book_Del(LinkList list){LinkList p,q=list,r;p=(LinkList)malloc(sizeof(LNode)); printf("请输入要删除的姓名:");scanf("%s",p->name);if(strcmp(p->name,list->name)==0) {list=q->link;free(q);printf("联系人删除成功!\n"); }else{r=list;while(q && strcmp(q->name,p->name)!=0) {r=q;q=q->link;}if(q==NULL)printf("本系统中没有此人!");else{r->link=q->link;free(q);printf("联系人删除成功!\n");}}return list;}void main(){int k;LinkList list=NULL;printf("\n欢迎使用个人电话号码查询系统\n");while(1){printf(" -------1新建个人电话号码信息--------\n"); printf(" -------2浏览个人电话号码信息---------\n"); printf(" -------3查找个人电话号码信息---------\n"); printf(" -------4删除个人电话号码信息---------\n"); printf(" -------0退出电话号码管查询系统-------\n"); printf("\n ------欢迎使用个人电话号码查询系统------\n"); printf("请选择你的操作(0,1,2,3,4):\n");scanf("%d",&k);switch(k){case 1:list=Book_Creat(list);getchar();break;case 2:list=Book_Print(list);break;case 3:Book_Search(list);break;case 4:list=Book_Del(list);break;case 0:printf("电话号码系统执行完毕!\n");exit(0);}}while(k<=4);}。
(完整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需求分析本次实验要求采用哈希表完成信息的查找和储存,哈希表即为散列表。
本程序采用学生信息管理为例,设每个学生有电话号码,学生姓名,家庭住址三个信息。
通过建立哈希表储存信息,信息储存在节点中,并通过以电话号码为关键字完成查找,并显示出该学生的姓名,电话号码以及家庭住址.当哈希表中的数据与输入的数据发生冲突时,使用节点向后移一位的方法来解决冲突。
2.系统设计2.1总体设计本系统通过设计学生信息类和哈希表类来完成整个系统。
通过学生信息类实现从键盘输入学生的姓名,电话号码以及家庭地址.将学生的信息储存在建立的哈希节点内,通过多个链表保存,相同信息的保存在同一个节点内。
实现手机号计数功能关键算法
实现手机号计数功能关键算法
手机号计数功能的关键算法可以使用哈希表。
具体实现步骤如下:
1. 创建一个哈希表,用于存储已经遍历过的手机号和出现的次数。
2. 遍历手机号列表,将每个手机号加入哈希表中。
3. 如果当前手机号在哈希表中不存在,则将该手机号的值初始化为1。
4. 如果当前手机号在哈希表中已存在,则将该手机号对应的值加1。
5. 最后遍历一遍哈希表,统计出现次数大于1的手机号的个数即可。
示例Python代码实现:
```
def count_phone_numbers(phone_numbers):
phone_counts = {}
for number in phone_numbers:
if number not in phone_counts:
phone_counts[number] = 1
else:
phone_counts[number] += 1
count = 0
for phone, count in phone_counts.items():
if count > 1:
count += 1
return count
```
这个算法的时间复杂度为O(n),其中n是手机号码的数量。
数据结构课程设计报告——哈希表实现电话号码查询
数据结构课程设计报告一、需求分析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)//按地址插入{以地址为关键字,调用关键字转换函数将对应的电话号码存储到相应的存储空间。
若该位置已经被存储,则向后移一位(当移到最后一位,就移到头部继续)。
若还有冲突重复上一步。
当所有空间都查过一遍,发现没有空位,则输出“没有存储空间”。
}void InserHT(HashTable ha)//Hash表插入{输入用户姓名、地址和电话,分别调用按姓名插入和按地址插入函数进行插入。
哈希表--数据结构课设
洛阳理工学院课程设计说明书课程名称数据结构设计课题哈希表的设计与实现专业班级学号姓名完成日期 2课程设计任务书设计题目:哈希表的设计与实现设计内容与要求:设计哈希表实现电话号码查询系统。
[基本要求]1、设每个记录有下列数据项:电话号码、用户名、地址;2、从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表;3、采用再哈希法解决冲突;4、查找并显示给定电话号码的记录;5、查找并显示给定用户名的记录。
6、在哈希函数确定的前提下,考察平均查找长度的变化。
指导教师:2014 年课程设计评语成绩:指导教师:年月日【问题描述】如何设计一个结构体数组使该数组中每个元素包含电话号码、用户名、地址。
如何分别以电话号码和用户名为关键字建立哈希表。
如何利用线性探测再散列法解决冲突。
如何实现用哈希法查找并显示给定电话号码的记录。
如何查找并显示给定用户的记录。
手工计算查找不成功的平均查找长度。
【基本要求】设计哈希表实现电话号码查询系统。
设计程序完成以下要求:(1)、设每个记录有下列数据项:电话号码、用户名、地址;(2)、从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表;(3)、采用再哈希法解决冲突(4)、查找并显示给定电话号码的记录;(5)、查找并显示给定用户的记录。
(6)、在哈希函数确定的前提下,考察平均查找长度的变化。
【测试数据】1.用户名:weiguo,号码:123,地址:gansu2.用户名:zhangkui,号码:321,地址:shanxi【算法思想】进入主函数,用户输入1:输入哈希表元素,然后再选择2或者3按照用户名或者电话号码散列,在这下面又有分支语句选择解决冲突的办法,用线性探测再散列还是再哈希法。
生成哈希表之后,选择查找操作3分别以用户名和电话号码为关键字进行查找。
最后,输出查找不成功的平均查找长度。
在本程序当中用了两种解决冲突的办法,分别是线性探测再散列和再哈希法。
哈希函数构造方法是,除留余数法。
数据结构 手机号码查询系统
数据结构方式号码查询系统数据结构方式号码查询系统1、系统概述在现代社会中,方式号码被广泛使用,人们需要通过方式号码进行通信和联系。
为了方便用户快速查询和管理方式号码,我们设计了一个方式号码查询系统,可实现以下功能:- 添加方式号码信息- 查询方式号码信息- 修改方式号码信息- 删除方式号码信息2、系统架构2.1 数据结构设计系统中使用以下数据结构来存储方式号码信息:- 链表:用于存储不同用户的方式号码信息,每个节点代表一个用户的信息,包括姓名、方式号码、地质等。
- 哈希表:用于快速查询方式号码,通过方式号码可以直接找到对应的用户信息。
2.2 模块设计系统分为以下几个模块:- 添加模块:用于用户添加新的方式号码信息,并将其存储到链表和哈希表中。
- 查询模块:提供根据方式号码查询用户信息的功能。
- 修改模块:允许用户修改已有的方式号码信息。
- 删除模块:用户可以删除不再需要的方式号码信息。
3、功能实现3.1 添加方式号码信息用户可以通过输入姓名、方式号码、地质等信息将新的方式号码添加到系统中。
3.2 查询方式号码信息用户可以通过输入方式号码进行查询,系统将返回对应的用户信息。
3.3 修改方式号码信息用户可以选择要修改的方式号码,并输入新的信息进行修改。
3.4 删除方式号码信息用户可以选择要删除的方式号码进行删除操作。
4、附件本文档附带的附件为系统的源代码和使用说明书。
5、法律名词及注释5.1 方式号码:指由数字组成的方式号码,用于流动通信。
5.2 链表:是一个线性数据结构,由一系列节点组成,节点之间通过指针连接。
5.3 哈希表:是根据关键码值(Key-value)进行访问的数据结构,通过将关键码值映射到表中的一个位置来访问数据。
Hash表技术用于电话号码识别
Hash表技术用于电话号码识别
黄宏
【期刊名称】《北方交通大学学报》
【年(卷),期】1991(015)004
【摘要】TC559计算机控制电话自动交换机具有多种服务功能.例如,无线有线,无线热线,无线市话,无线无线等等.考虑到不同的服务目的,对不同的移动台,交换机的服务项目是不一样的.这时需要识别移动台的号码以作不同的处理.识别移动台的号码在计算机软件中可归结为查表技术的应用.
【总页数】3页(P97-99)
【作者】黄宏
【作者单位】无
【正文语种】中文
【中图分类】TN916.42
【相关文献】
1.用Hash表技术实现快速流分类 [J], 李英毅;贾雨
2.基于大数据算法的电话号码与客户编号对应关系的识别研究与实现 [J], 刘鲲鹏;盛妍;何薇;宫立华
3.基于卷积神经网络的电话号码手写体识别系统开发 [J], 杨柳;罗玉梅
4.英文电话号码本识别系统 [J], 郑新春;柴佩琪
5.射频识别技术结合人脸识别技术用于试剂"细化""动态"管理 [J], 翁玉华;任艳平;潘蕊;许振玲;颜长明;欧阳小清;董志强;张春艳;阮婵姿;吕银云
因版权原因,仅展示原文概要,查看原文内容请购买。
小型电话号码查询系统
小型电话号码查询系统王雨娉目录摘要 (1)1绪论 (1)2系统分析 (1)2.1功能需求 (1)2.2性能需求 (2)3总体设计 (2)3.1功能模块设计 (2)3.2系统设计方案 (3)4详细设计 (3)4.1系统信息添加和结果显示模块 (3)4.2系统信息保存和清空操作模块 (6)4.3系统信息查询模块 (7)5调试与测试 (8)5.1调试 (8)5.2测试 (10)6结论 (9)结束语 (9)参考文献 (9)附录1-用户手册 (10)附录2-源程序 (15)摘要当前社会已经步入了一个信息化的时代,随着社会劳动生产率的不断提高,与之相对应的信息查询服务系统也在不断的完善。
本程序运用查找函数和结构体的建立,构建的哈希表采用再哈希的方法解决冲突,实现电话号码及有相关信息的准确查询,同时编译了对信息的保存和清空函数,使该电话号码的查询系统操作起来更加自如。
本文从分析课题的题目背景、题目意义、题目要求等出发,分别从需求分析、总体设计、详细设计、测试等各个方面详细介绍了系统的设计与实现过程,最后对系统的完成情况进行了总结。
关键词:哈希表;再哈希法;查找函数1绪论高度信息化的年代里,电话号码信息系统的出现正是当前时代发展的需要,它的出现给我们的工作生活无疑带来了很多方便。
编程人员通过对电话号码及其相关信息查询功能的不断编写和完善,来尽量满足人们的需要。
根据课程设计任务书要求,本程序的开发主要完成以下功能和性能。
(1)设置一个包括用户姓、地址、号码的信息的结构体。
(2)编译void Create()函数来创建结点,运用int Apend()函数来添加结点信息,通过node* Input()函数来对用户的信息进行存储。
(3)编译函数void List()、void List2()分别根据号码和姓名的查询方式显示用户信息的哈希结果,并且结果会在屏幕上显示出来。
(4)编译void Find(char num[11]) 、void Find2(char name[8])函数分别根据用户的电话号码和姓名对用户的详细信息进行查找,当要查询的结果不在系统存储时,屏幕上将显示“无此记录”。
设计哈希表实现电话号码查询系统
key = key + *p;
key = key % 42;// 用除留取余法获得关键码
while(sign[key]=='1')//判断是否有冲突
{
key=Random(key,i+1);//有冲突则调用冲突处理函数
}
if(key==-1) exit(1);//无冲突
用户使用时显示菜单,用户输入菜单选项完成操作。
2.输出的形式
查找的结果显示在屏幕上。未被查找到的内容输出到out.txt文档中。
在用户需要时,将哈希表显示在屏幕上。
3.程序所能达到的功能
根据用户的选择,从原有文档读入数据或随机生成数据,分别以姓名和电话号码做为关键字生成哈希表。生成哈希表后用户可以根据相应关键字进行数据的查找,若查找到对应的数据则将数据输出到屏幕,若没有查找到对应的数据则将用户输入的查找内容输出到out.txt文档。在用户选择显示哈希表时,显示完整的哈希表。
K++;
dat[key].name=name;//将数据存入哈希表
dat[key].address=address;
dat[key].phone=phone;
sign[key] = '1';//设置冲突标志
}
int Rehash(int key,string str) // 再哈希法处理冲突
{
if((key==-1)||(sign[key]=='0'))//判断哈希表中没有记录
{
fout.open("out.txt");//打开文件
if(fout.fail())//检查文件打开情况
(完整版)哈希表的设计与实现毕业设计
哈希表的设计与实现摘要哈希表的设计与实现是用Visual C++ 6.0编写的能够实现数据的存储,更新与查找的程序。
它可以方便的进行基本数据信息的输入(如:、电话、地址等),查询(按查询.按电话号查询),删除(运用删除),添加新的数据等。
易于管理员进行管理。
本设计使用Visual C++ 6.0开发工具利用其提供的各种面向对象的开发工具将数据信息定义在结构体中,运用类实现了对数据不同信息的操作功能。
关键字:哈希表; Visual C++ 6.0; 地址目录1、题目分析 .............................................................2、设计思路 .............................................................2.1问题描述......................................................2.2基本要求......................................................2.3数据结构......................................................3、设计思路 .............................................................4、测试的实验结果和测试过程..............................................4.1详细设计......................................................4.2屏幕截图......................................................4.3问题分析:....................................................5、课程设计体会及问题分析................................................6、参考文献 .............................................................7、源程序清单 ...........................................................1、题目分析在21世纪信息时代里,各个机构企业都需要处理一些庞大的重要的数据,而这些数据既需要随时查找还需要随时纪录新的数据。
数据结构课程设计通讯录、电话号码查询系统
一、课程设计概述:本次数据结构课程设计共完成两个题:电话号码查询系统、通讯录。
使用语言:C编译环境:VC6.0二、课程设计题目一[实验内容]电话号码查询系统[问题描述]设计散列表实现电话号码查找系统。
[需求分析](1)设每个记录有下列数据项:电话号码、用户名、地址;(2)从键盘输入各记录,分别以电话号码和用户名为关键字建立散列表;(3)采用一定的方法解决冲突;(4)查找并显示给定电话号码的记录;(5)查找并显示给定用户名的记录。
整个系统必须满足系统功能要求;设计不同的散列函数,比较冲突率;在散列函数确定的前提下,尝试各种不同类型处理冲突的方法,考察平均查找长度的变化。
[概要设计]void getin(Record* a) // 键盘输入联系人的信息void ShowInformation(Record* a) //显示输入的用户信息Status collision(int p,int &c) // 冲突处理函数,采用二次探测再散列法解决冲突void CreateHash(HashTable* H ,Record* a) // 建表,若哈希地址冲突,进行冲突处理void SearchHash ( HashTable* H,int &c) //在通讯录里查找关键字void Save() //保存void main_menu()[存储结构]typedef struct{//记录NA name;NA tel;NA add;}Record;typedef struct{//哈希表Record *elem[HASHSIZE]; //数据元素存储基址int count; //当前数据元素个数int size; //当前容量}HashTable;[详细设计]#include<iostream> //cout,cin语句的头文件#include<stdlib.h> //清屏函数头文件:使用csl时调用system#include<string> //字符串头文件#include<stdio.h>#include<fstream>#define MAXSIZE 100 //电话薄记录的数量#define MAX_SIZE 50 //用户名、电话号码、地址的最大长度#define HASHSIZE 400 //定义表长#define SUCCESS 1 //查找#define UNSUCCESS -1#define LEN sizeof(HashTable) // 哈希表的长度using namespace std;typedef int Status;//typedef用来定义类型的别名。
- 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.txtvoid 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、查看文件八课程设计总结1、收获学会了C++的跟踪。
更进一步了解和熟悉了关于哈希表的运用和文件的读取与写入操作。
同时锻炼了对话形式的菜单的创建和熟练运用。
2、心得体会在这次数据结构设计中遇到了很多实际性的问题,在实际设计中才发现,书本上理论性的东西与在实际运用中的还是有一定的出入的,所以有些问题要不断地更正以前的错误思维。
通过这次设计,我懂得了学习的重要性,了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力,这将为自己今后的学习和工作做出了最好的榜样。
我觉得作为一名计科专业的学生,这次课程设计是很有意义的。
更重要的是如何把自己平时所学的东西应用到实际中。
虽然自己对于这门课懂的并不多,很多基础的东西都还没有很好的掌握,觉得很难,也没有很有效的办法通过自身去理解,但是靠着学习,渐渐对这门课逐渐产生了些许的兴趣,自己开始主动学习并逐步从基础慢慢开始弄懂它。
附录:源程序#include <fstream>#include <iostream>#include <string>using namespace std;ifstream in_file;ofstream out_file;int D[10]={1,3,5,8,13,15,17,21,27,34};//伪随机数序列int count;//当前数据元素个数int sizeindex;//哈希表的长度char *sign;//冲突的标志struct Data{string name;string phone;string address;}; Data *intermediate_data;int Collision_Random(int key,int i)//伪随机数探量观测再散列法处理冲突{int Re_key;if(sign[key]=='1'){Re_key=(key+D[i])%sizeindex;return Re_key;//归回新的要害码}return -1;}void Init_HashTable_by_name(string name,string phone,string address)//以姓名为关键字建立哈希表{int i=0;int key;char*p;for(key=0,p=&name[0];*p;p++)key=key+*p;key=key%42;while(sign[key]=='1'){key=Collision_Random(key,i+1);}if(key==-1)exit(1);count++;intermediate_data[key].name=name;//将数据存入哈希表intermediate_data[key].address=address;intermediate_data[key].phone=phone;sign[key]='1';//设置冲突标志}int Collision_Rehash(int key,string str)//再哈希法处理冲突{int Re_key;int num1=(str[0]-'0')*1000+(str[1]-'0')*100+(str[2]-'0')*10+(str[3]-'0');int num2=(str[4]-'0')*1000+(str[5]-'0')*100+(str[6]-'0')*10+(str[7]-'0');int num3=(str[8]-'0')*100+(str[9]-'0')*10+(str[10]-'0');Re_key=num1+num2+num3;Re_key=(Re_key+key)%sizeindex;return Re_key;}void Init_HashTable_by_phone(string name,string phone,string address)//以电话号码为关键字建立哈希表{int key;char*p;for(key=0,p=&phone[0];*p;p++)key=key+*p;key=key%42;while(sign[key]=='1'){key=Collision_Rehash(key,phone);}count++;intermediate_data[key].name=name;intermediate_data[key].address=address;intermediate_data[key].phone=phone;sign[key]='1';}void Outfile(string name,int key)//在没有找到时输出未找到的记录,打开文件out.txt并将记录储存在文档中{if((key==-1)||(sign[key]=='0')){out_file.open("out.txt");if(out_file.fail()){cout<<"\n"<<"文件打开失败!!!\n"<<endl;exit(1);}out_file<<name<<endl;out_file.close();}}void Outhash(int key)//输出哈希表中的记录{unsigned i;if((key==-1)||(sign[key]=='0')){cout<<"\n"<<"无此记录!!!\n"<<endl;}else{for(i=0;i<strlen(&(intermediate_data[key].name[0]));i++) cout<<intermediate_data[key].name[i];for(i=0;i<8;i++)cout<<" ";cout<<intermediate_data[key].phone;for(i=0;i<8;i++)cout<<" ";cout<<intermediate_data[key].address<<endl;}}void Rafile()//随机生成数据,并将数据保存在new.txt{int i,j;out_file.open("new.txt");if(out_file.fail()){cout<<"\n"<<"文件打开失败!!!\n"<<endl;exit(1);}for(j=0;j<30;j++){string name="";for(i=0;i<20;i++)name+=rand()%26+'a';out_file<<name<<" ";string phone="";for(i=0;i<11;i++)phone+=rand()%10+'0';out_file<<phone<<" ";string address="";for(i=0;i<29;i++)address+=rand()%26+'a';address+=',';out_file<<address<<endl;}out_file<<"*";out_file.close();}void Init_HashTable(char*fname,int n)//建立哈希表{string name="";string phone="";string address="";int i,j;in_file.open(fname);if(in_file.fail()){cout<<"\n"<<"文件打开失败!!!\n"<<endl;exit(1);}while(!in_file.eof()){char* str=new char[100];name="";phone="";address="";in_file.getline(str,100,'\n');//按行读入数据if(str[0]=='*')//判断数据结束break;i=0;while(str[i]<=97||str[i]>=122)i++;for(;str[i]!=' ';i++)name+=str[i];while(str[i]==' ')i++;for(j=0;str[i]!=' ';j++,i++)phone+=str[i];while(str[i]==' ')i++;for(j=0;str[i]!=',';j++,i++)address+=str[i];if(n==1)Init_HashTable_by_name(name,phone,address);//以姓名为关键字else Init_HashTable_by_phone(name,phone,address);//以电话号码为关键字delete str;}in_file.close();}int Search_by_name(string name)//根据姓名查找哈希表中的记录{int i=0;int j=1;int key;char*p;for(key=0,p=&name[0];*p;p++)key=key+*p;key=key%42;while(sign[key]=='1'&&(intermediate_data[key].name!=name)) {key=Collision_Random(key,i+1);j++;if(j=count)return -1;}return key;}int Search_by_phone(string phone)//根据电话号码查找哈希表中的记录{int key;char*p;for(key=0,p=&phone[0];*p;p++)key=key+*p;key=key%42;int j=1;while(sign[key]=='1'&&(intermediate_data[key].phone!=phone)) {key=Collision_Rehash(key,phone);j++;if(j=count)return-1;}return key;}void main(){count=0;sizeindex=50;int i,k;int ch;char *Fname;sign=new char[sizeindex];intermediate_data=new Data[sizeindex];for(i=0;i<sizeindex;i++)sign[i]='0';sign[i]='\0';for(i=0;i<sizeindex;i++){intermediate_data[i].name="";intermediate_data[i].phone="";intermediate_data[i].address="";}cout<<"§**********************************************************§"<<endl;cout<<"§**§"<<endl;cout<<"§* 请选择用于查找的数据来源*§"<<endl;cout<<"§* *§"<<endl;cout<<"§* 1 . old.TXT*§"<<endl;cout<<"§* 2 . 随机生成*§"<<endl;cout<<"§* 0 . 退出程序*§"<<endl;cout<<"§**********************************************************§"<<endl;do{cout<<"\n"<< " 请输入选择 : \n";cin>>k;switch(k){case 0:return;case 1:Fname="old.txt";break;case 2:Rafile();Fname="new.txt";break;default:cout<<"输入序号有误,请重新输入!!!\n"<<endl;}}while((k!=1)&&(k!=2)&&(k!=0));//system("cls");cout<<"§**********************************************************§"<<endl;cout<<"§* *§"<<endl;cout<<"§* 请选择查找方式*§"<<endl;cout<<"§* *§"<<endl;cout<<"§* 1 . 根据姓名查找*§"<<endl;cout<<"§* 2 . 根据电话号查找*§"<<endl;cout<<"§* *§"<<endl;cout<<"§**********************************************************§"<<endl;do{cout<<"\n"<< " 请输入选择 : \n";cin>>ch;if(ch!=1&&ch!=2){cout<<" 输入序号有误,请重新输入!!!\n"<<endl;}}while((ch!=1)&&(ch!=2));//system("cls");Init_HashTable(Fname,ch);while(ch==1){int choice;cout<<"§**********************************************************§"<<endl;cout<<"§* *§"<<endl;cout<<"§* 请选择功能*§"<<endl;cout<<"§**§"<<endl;cout<<"§* 1 . 输入姓名查找数据*§"<<endl;cout<<"§* 2 . 显示哈希表*§"<<endl;cout<<"§* 0 . 退出程序!!! *§"<<endl;cout<<"§**§"<<endl;cout<<"§**********************************************************§"<<endl;do{cout<<"\n"<< " 请输入选择 : \n";cin>>choice;switch(choice){case 1:{int key1;string name;cout<<"\n"<<" 请输入姓名: \n";cin>>name;key1=Search_by_name(name);Outfile(name,key1);cout<<"\n"<<"查找结果:\n"<<endl;Outhash(key1);}break;case 2:{cout<<"\n"<<" 哈希表: \n"<<endl;for(i=0;i<sizeindex;i++){if(sign[i]!='0'){cout<<"* ";Outhash(i);}}cout<<"* *"<<endl;}break;case 0:return;default:cout<<" 输入序号有误,请重新输入!!!\n"<<endl;}}while((choice!=1)&&(choice!=2)&&(choice!=0));}while(ch==2){int choice;cout<<"§**********************************************************§"<< endl;cout<<"§* *§"<<endl;cout<<"§* 请选择功能*§"<<endl;cout<<"§* 1 . 输入电话查找数据*§"<<endl;cout<<"§* 2 . 显示哈希表*§"<<endl;cout<<"§* 0 . 退出*§"<<endl;cout<<"§* *§"<<endl;cout<<"§**********************************************************§"<<endl;do{cout<<"\n"<< " 请输入选择 : \n";cin>>choice;switch(choice){case 1:{int key2;string phone;do{cout<<"* 请输入11位的电话号码: ";cin>>phone;if(strlen(&phone[0])!=11){cout<<"\n"<<"电话号码输入不正确!请重新输入!!!\n"<<endl;}}while(strlen(&phone[0])!=11);key2=Search_by_phone(phone);Outfile(phone,key2);cout<<"\n"<<"查找结果:\n"<<endl;cout<<"* ";Outhash(key2);}break;case 2:{cout<<"\n"<<"哈希表:\n"<<endl;for(i=0;i<sizeindex;i++){if(sign[i]!='0'){cout<<"* ";Outhash(i);}}cout<<"* *"<<endl;}break;case 0:return;default:cout<<" 输入序号有误,请重新输入!!!\n"<<endl;}}while((choice!=1)&&(choice!=2)&&(choice!=0));}}。