哈希表实现号码查询实验报告
哈希查找的实现与分析报告(顺序).docx
目录1 课程设计内容 (1)1.1课程设计目的 (1)1.2课程设计要求 (1)1.3课程设计背景 (1)2 概要设计 (2)2.1程序模块结构图 (2)2.2主界面模块说明 (2)2.3读取学生信息模块说明 (2)3 详细设计 (3)3.1建立哈希表 (3)3.2计算哈希值 (3)3.3读取文件 (4)3.4显示所有学生信息 (6)3.5查找学生信息 (7)3.6界面显示 (9)3.7主函数 (10)4 问题与解决 (12)小结 (13)参考文献 (13)1 课程设计内容1.1 课程设计目的课程设计题目:哈希查找的实现与分析(1)掌握哈希函数的构造原则及哈希表的生成方法,并能在解决实际问题时灵活应用。
(2)掌握哈希查找的基本过程及其适用场合。
(3)巩固在散列查找时解决冲突的方法,并比较各种方法的特点。
(4)掌握平均查找长度ASL的计算方法。
1.2 课程设计要求程序要求实现的功能有:(1)所有数据从文本文件Hash.txt中读取。
(2)根据实际问题自行构造合理的哈希函数,要求采用开放定址法或拉链法,解决Hash 表的冲突。
(3)严格按照哈希表构造的一般原则进行编程(不能简单地将文件中的数据读到一个数组里,再从数组里完成相应的查找功能)。
(4)计算该哈希表查找成功时的ASL,并在课设报告中给出具体分析过程。
(5)如果一个班级中有两个同学抽中此题,则要求学号在前面的同学用拉链法,学号在后面的同学用开放定址法来解决冲突。
1.3 课程设计背景哈希查找的产生有这样一种背景——有些数据本身是无法排序的(如图像),有些数据是很难比较的(如图像)。
如果数据本身是无法排序的,就不能对它们进行比较查找。
如果数据是很难比较的,即使采用折半查找,要比较的次数也是非常多的。
因此,哈希查找并不查找数据本身,而是先将数据映射为一个整数(它的哈希值),并将哈希值相同的数据存放在同一个位置一即以哈希值为索引构造一个数组。
在哈希查找的过程中,只需先将要查找的数据映射为它的哈希值,然后查找具有这个哈希值的数据,这就大大减少了查找次数。
大数据结构课程设计--哈希表实验报告材料
福建工程学院课程设计课程:算法与数据结构题目:哈希表专业:网络工程班级:xxxxxx班座号:xxxxxxxxxxxx姓名:xxxxxxx2011年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;哈希表元素的定义,包含数据元素存储基址、数据元素个数、当前容量。
2、关键算法的设计(1)姓名的折叠处理long fold(NA s) //人名的折叠处理{char *p;long sum=0;NA ss;strcpy(ss,s); //复制字符串,不改变原字符串的大小写strupr(ss); //将字符串ss转换为大写形式p=ss;while(*p!='\0')sum+=*p++;printf("\nsum====================%d",sum);return sum;}(2)建立哈希表1、用除留余数法构建哈希函数2、用线性探测再散列法处理冲突int Hash1(NA str) //哈希函数{long n;int m;n=fold(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;}void benGetTime();void CreateHash1(HashTable* H,Record* a) //建表,以人的姓名为关键字,建立相应的散列表{ int i,p=-1,c,pp;system("cls"); //若哈希地址冲突,进行冲突处理benGetTime();for(i=0;i<NUM_BER;i++){c=0;p=Hash1(a[i].name);pp=p;while(H->elem[pp]!=NULL) {pp=collision(p,c);if(pp<0){printf("第%d记录无法解决冲突",i+1); //需要显示冲突次数时输出continue;} //无法解决冲突,跳入下一循环}H->elem[pp]=&(a[i]); //求得哈希地址,将信息存入H->count++;printf("第%d个记录冲突次数为%d。
数据结构课程设计--哈希表实验报告
福建工程学院课程设计课程:算法与数据结构题目:哈希表专业:网络工程班级:xxxxxx班座号:xxxxxxxxxxxx姓名:xxxxxxx2011年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;哈希表元素的定义,包含数据元素存储基址、数据元素个数、当前容量。
2、关键算法的设计(1)姓名的折叠处理long fold(NA s) //人名的折叠处理{char *p;long sum=0;NA ss;strcpy(ss,s); //复制字符串,不改变原字符串的大小写strupr(ss); //将字符串ss转换为大写形式p=ss;while(*p!='\0')sum+=*p++;printf("\nsum====================%d",sum);return sum;}(2)建立哈希表1、用除留余数法构建哈希函数2、用线性探测再散列法处理冲突int Hash1(NA str) //哈希函数{long n;int m;n=fold(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;}void benGetTime();}else printf("\n此人不存在,查找不成功!\n");benGetTime();}(4)显示哈希表void ShowInformation(Record* a) //显示输入的用户信息{int i;system("cls");for( i=0;i<NUM_BER;i++)printf("\n第%d个用户信息:\n 姓名:%s\n 学号:%s\n 电话号码:%s\n",i+1,a[i].name,a[i].xuehao,a[i].tel);}(5)主函数的设计void main(int argc, char* argv[]){Record a[MAXSIZE];int c,flag=1,i=0;HashTable *H;H=(HashTable*)malloc(LEN);for(i=0;i<HASHSIZE;i++){H->elem[i]=NULL;H->size=HASHSIZE;H->count=0;}while (1){ int num;printf("\n ");printf("\n 欢迎使用同学通讯录录入查找系统");printf("\n 哈希表的设计与实现");printf("\n 【1】. 添加用户信息");printf("\n 【2】. 读取所有用户信息");printf("\n 【3】. 以姓名建立哈希表(再哈希法解决冲突) ");printf("\n 【4】. 以电话号码建立哈希表(再哈希法解决冲突) ");printf("\n 【5】. 查找并显示给定用户名的记录");printf("\n 【6】. 查找并显示给定电话号码的记录");printf("\n 【7】. 清屏");printf("\n 【8】. 保存");printf("\n 【9】. 退出程序");printf("\n 温馨提示:");printf("\n Ⅰ.进行5操作前请先输出3 ");printf("\n Ⅱ.进行6操作前请先输出4 ");printf("\n");printf("请输入一个任务选项>>>");printf("\n");scanf("%d",&num);switch(num){case 1:getin(a);break;case 2:ShowInformation(a);break;case 3:CreateHash1(H,a); /* 以姓名建立哈希表*/break;case 4:CreateHash2(H,a); /* 以电话号码建立哈希表*/break;case 5:c=0;SearchHash1(H,c);break;case 6:c=0;SearchHash2(H,c);break;case 7:Cls(a);break;case 8:Save();break;case 9:return 0;break;default:printf("你输错了,请重新输入!");printf("\n");}}system("pause");return 0;3、模块结构图及各模块的功能:四、源程序清单:#include<stdio.h>#include<stdlib.h>#include<string.h>#include <windows.h>#define MAXSIZE 20 #define MAX_SIZE 20 #define HASHSIZE 53 #define SUCCESS 1#define UNSUCCESS -1#define LEN sizeof(HashTable)typedef int Status;typedef char NA[MAX_SIZE];typedef struct {NA name;NA xuehao;NA tel;}Record;typedef struct {Record *elem[HASHSIZE]; int count; int size; }HashTable;Status eq(NA x,NA y) {if(strcmp(x,y)==0)return SUCCESS;else return UNSUCCESS;}Status NUM_BER;void getin(Record* a) {int i;system("cls");printf("输入要添加的个数:\n");scanf("%d",&NUM_BER);for(i=0;i<NUM_BER;i++){printf("请输入第%d个记录的姓名:\n",i+1);scanf("%s",a[i].name);printf("请输入%d个记录的学号:\n",i+1);scanf("%s",a[i].xuehao);printf("请输入第%d个记录的电话号码:\n",i+1);scanf("%s",a[i].tel);}}void ShowInformation(Record* a){int i;system("cls");for( i=0;i<NUM_BER;i++)printf("\n第%d个用户信息:\n 姓名:%s\n 学号:%s\n 电话号码:%s\n",i+1,a[i].name,a[i].xuehao,a[i].tel);}void Cls(Record* a){printf("*");system("cls");}long fold(NA s){char *p;long sum=0;NA ss;strcpy(ss,s);strupr(ss);p=ss;while(*p!='\0')sum+=*p++;printf("\nsum====================%d",sum);return sum;}int Hash1(NA str){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;}void benGetTime();void CreateHash1(HashTable* H,Record* a){ int i,p=-1,c,pp;system("cls"); benGetTime();for(i=0;i<NUM_BER;i++){p=Hash1(a[i].name);pp=p;while(H->elem[pp]!=NULL) {pp=collision(p,c);if(pp<0){printf("第%d记录无法解决冲突",i+1);continue;}}H->elem[pp]=&(a[i]);H->count++;printf("第%d个记录冲突次数为%d。
哈希查找_数据结构实验报告
哈希查找_数据结构实验报告哈希查找_数据结构实验报告一:实验目的本实验旨在掌握哈希查找算法的原理和实现方法,深入了解数据结构中的哈希查找技术,并通过实际操作加深对哈希查找的理解。
二:实验原理哈希查找是一种基于哈希函数的查找技术,通过将关键字通过哈希函数映射到哈希表中的位置进行查找。
其主要原理步骤如下:1. 创建哈希表:根据需求确定哈希表的大小,在内存中分配对应大小的空间。
2. 哈希函数的选择:根据关键字的特性选择适合的哈希函数,将关键字映射到哈希表的存储位置。
3. 插入操作:将关键字通过哈希函数计算得到索引位置,如果该位置为空,则直接插入;如果该位置已存在关键字,则发生冲突,需要解决冲突。
4. 冲突解决:常见的冲突解决方法包括线性探测、二次探测和链地址法等。
5. 查找操作:通过哈希函数计算得到关键字的索引位置,进行查找操作。
如果该位置为空,则表示查找失败;如果该位置不为空,则继续比较关键字是否相等。
6. 删除操作:将关键字标记为删除状态,或将该位置置为空。
三:实验步骤本实验中,我们以哈希表实现哈希查找算法,具体步骤如下:1. 创建哈希表:- 确定哈希表的大小。
- 在内存中分配对应大小的空间。
- 将所有位置初始化为空。
2. 哈希函数的选择:- 根据关键字的特性选择适合的哈希函数。
- 哈希函数应尽量保证均匀分布,避免冲突。
3. 插入操作:- 输入待插入的关键字。
- 通过哈希函数计算得到关键字的索引位置。
- 如果该位置为空,则直接插入关键字;如果该位置不为空,则发生冲突,需要解决冲突。
4. 冲突解决:- 使用线性探测法解决冲突:- 从发生冲突的位置向后逐个查找下一个为空的位置,直到找到空位置或遍历完整个哈希表。
- 如果找到空位置,则将关键字插入该位置;如果遍历完整个哈希表仍没有空位置,则插入失败。
- 使用链地址法解决冲突:- 在每个哈希表位置上维护一个链表,将冲突的关键字插入到链表中。
5. 查找操作:- 输入待查找的关键字。
(完整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总体设计本系统通过设计学生信息类和哈希表类来完成整个系统。
通过学生信息类实现从键盘输入学生的姓名,电话号码以及家庭地址.将学生的信息储存在建立的哈希节点内,通过多个链表保存,相同信息的保存在同一个节点内。
设计哈希表实现电话号码查询系统C语言版(课程设计报告)
设计哈希表实现查询系统一﹑目的通过课程设计,巩固和加深对结构体、文件、哈希表等理论知识的理解;掌握现实复杂问题的分析建模和解决方法,掌握包括问题描述、系统分析、设计建模、代码实现、结果分析等的方法;提高利用计算机分析解决综合性实际问题的基本能力;锻炼个人动手能力,历练自身素质。
哈希表实现查询系统是利用哈希表实现系统的快速查询,程序实现哈希表建表和查表,并实现对没有查找到的内容进行记录。
掌握哈希表的工作原理,熟悉建立哈希表、对哈希表冲突处理、哈希表查找等功能的实现,回顾文件读取、写入,回顾随机函数的作用。
二﹑需求分析1.输入的形式和输入值的范围数据输入分两种模式:一种是将原有数据记录在old.txt文档中,由程序读入;另一种是由程序随机生成,并储存在new.txt文档中。
数据的格式为:##、、家庭住址。
用户使用时显示菜单,用户输入菜单选项完成操作。
2.输出的形式查找的结果显示在屏幕上。
未被查找到的内容输出到out.txt文档中。
在用户需要时,将哈希表显示在屏幕上。
3.程序所能达到的功能根据用户的选择,从原有文档读入数据或随机生成数据,分别以##和做为关键字生成哈希表。
生成哈希表后用户可以根据相应关键字进行数据的查找,若查找到对应的数据则将数据输出到屏幕,若没有查找到对应的数据则将用户输入的查找内容输出到out.txt文档。
在用户选择显示哈希表时,显示完整的哈希表。
程序使用文字菜单的友好界面。
在数据输入时对输入内容进行范围控制。
4.初步测试计划在old.txt文档中输入30条记录,令程序读入并分别以##和做为关键字生成哈希表,查找记录中原有的记录,查看输出数据,查找记录中没有的记录查看回馈,查看整个哈希表的数据。
令程序随机生成记录,查看new.txt文档,分别以##和做为关键字生成哈希表,查看整个哈希表的数据,分别查找原有和没有的记录,查看回馈。
三﹑概要设计1.数据类型定义结构体类型存储每条记录。
struct Data{char name[sizename];char phone[sizephone];char address[sizeaddress];bool used;}*hash_data;2各种函数说明:int get_hashkey(char* str,int select)// 获得关键字void show(int i)// 显示每条信息void Store(char *str)//在没有找到时输出未找到的记录,打开文件out.txt并将记录储存在文档中void Allshow()//输出哈希表中的记录void Auto_file()//随机生成数据,并将数据保存在new.txtvoid Build_Hash(int HashType)//建立哈希表void FindName()//根据##查找哈希表中的记录void FindPhone()//根据查找哈希表中的记录四﹑详细设计1.头文件与定义结构体类型#include <time.h>#include <stdio.h>#include <string.h>#include <stdlib.h>struct Data{string name;//string phone;string address;}; Data *hash_data;2.定义长度#define sizehash 100#define sizename 20#define sizephone 15#define sizeaddress 403.获取关键字函数int get_hashkey(char* str,int select) {int Key=0, ReKey,m;char tmp[10];for (int i=0;i<strlen(str);i++){Key+=str[i];}Key%=sizehash;if (hash_data[Key].used) {m=Key;Key=-1;if (select==1){for (i=0;i<10;i++){ReKey=(m+A[i])%sizehash;if (!hash_data[ReKey].used){Key=ReKey;break;}}}else if (select==2){ReKey=m;for (i=0;i<100;i++){ ReKey=ReKey+1;ReKey=ReKey%sizehash;if (!hash_data[ReKey].used){Key=ReKey;break;}}}}return Key;}4.产生hash表void Build_Hash(int HashType){for (int i=0;i<sizehash;i++) hash_data[i].used=false;FILE* reader=fopen(DataFile,"r");if (reader==NULL){printf( "%s读取失败\n",DataFile);fclose(reader);exit(1);}char s[100];char seps[]=" ,\t";char *name;char* phone;char* address;int HashKey;while (!feof(reader)){fgets(s,100,reader);if (strlen(s)>0){name=strtok(s,seps);phone=strtok(NULL,seps);address=strtok(NULL,seps);if (HashType==1){HashKey=get_hashkey(name,HashType); }else if (HashType==2) {HashKey=get_hashkey(phone,HashType); }if (HashKey==-1){printf( "哈希表过小或哈希碰撞过多");fclose(reader);exit(1);}else{strcpy(hash_data[HashKey].name,name);strcpy(hash_data[HashKey].phone,phone);strcpy(hash_data[HashKey].address,address);hash_data[HashKey].used=true;}}}fclose(reader);}5.在没有找到时输出未找到的记录,打开文件out.txt并将记录储存在文档中void Store(char *str)//将查找失败记录添加到out.txt文件末尾{FILE* pf=fopen("out.txt","wa"); //以追加的方式写入if (pf==NULL)//判断文件是否打开成功{printf( "创建out.txt失败\n");fclose(pf);exit(1);}fscanf(pf,"%s",str);fclose(pf);}6.输出哈希表中的记录void Allshow(){for (int i=0;i<sizehash;i++){if (hash_data[i].used){show(i);}}printf("\n\n");}7.随机生成数据,并将数据保存在new.txt void Auto_file(){FILE* fp=fopen("new.txt", "w+");writer.open("new.txt");if(fp==NULL){printf( "创ä¡ä建¡§new.txt失º¡ì败㨹!\n\n");fclose(fp);exit(1);}char s[100]={0};int k=0;srand(time(0));for (int i=0;i<50;i++){memset(s,0,100);k=0;//随?机¨²产¨²生¦¨²用®?户¡ì名?for (int j=0;j<8;j++,k++){s[k]='a'+rand()%26;}//随?机¨²产¨²生¦¨²电Ì?话¡ã号?码?s[k++]='\t';for (j=0;j<12;j++,k++){s[k]='0'+rand()%10;}//随?机¨²产¨²生¦¨²地Ì?址¡¤s[k++]='\t';for (j=0;j<20;j++,k++){s[k]='a'+rand()%26;}fprintf(fp,"%s",s);if(i!=49)fprintf(fp,"\n");}fclose(fp);}8.根据##查找哈希表中的记录int Find_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%43;while(1){if(sign[key]=='0'&&key<=42){key++;j++;}if(hash_data[key].name==name)return key;else{key=Handle_Random(key,i);j++;}if(j==num)return -1;}}9.根据用户名查找记录void FindName(){char name[10]="";printf( "请输入要查找的用户名:");scanf("%s",name);int i=Find(name,1);if (i==-1){printf( "无此记录\n");Store(name);}else{printf( "查找结果:\n");show(i);}printf("\n\n");}10.根据查找记录void FindPhone(){char phone[12]="";printf( "请输入要查找的:");scanf("%s",phone);int i=Find(phone,2);if (i==-1){printf( "无此记!\n");Store(phone);}else{printf( "查找结果:\n");show(i);}printf("\n\n"); }12.整个程序的流程图如下五﹑调试分析1.测试环境在Windows 7环境下的Visual C++ 6.0。
数据结构课程设计报告——哈希表实现电话号码查询
数据结构课程设计报告一、需求分析1问题描述:根据需要设计出合理的函数,并由此建立相应的表。
要求:1)每个电话用户信息包括(姓名,电话,住址)信息。
2)可以使用姓名与地址查找相应的用户信息。
3)使用表实现。
使用开放定址法解决冲突。
2 基本要求:1)记录每个用户的姓名、地址和电话。
2)从键盘输入,以姓名和地址为关键字分别建立表。
3)用开放地址法解决冲突。
4)分别按姓名和地址查找并显示电话号码。
二、概要设计三、详细设计定义结构表{定义表内的所有成员}[];( x[])关键字转换为数值{求字符数组x每个字符对应的值的绝对值之和,并返回最后结果}( )创建表{创建表,并初始化它}( d) 按姓名插入{以姓名为关键字,调用关键字转换函数将对应的电话号码存储到相应的存储空间。
若该位置已经被存储,则向后移一位(当移到最后一位,就移到头部继续)。
若还有冲突重复上一步。
当所有空间都查过一遍,发现没有空位,则输出“没有存储空间”。
}( d)按地址插入{以地址为关键字,调用关键字转换函数将对应的电话号码存储到相应的存储空间。
若该位置已经被存储,则向后移一位(当移到最后一位,就移到头部继续)。
若还有冲突重复上一步。
当所有空间都查过一遍,发现没有空位,则输出“没有存储空间”。
}( )表插入{输入用户姓名、地址和电话,分别调用按姓名插入和按地址插入函数进行插入。
重复上面的步骤,直到你不想继续或空间已满。
}( )按姓名查找{输入你想要查询的姓名,对它进行转换,再查找。
若该位置不空或求得的关键字所对应的数值与该位置的数值不相等,则向后移一位(当移到最后一位,就移到头部继续)。
若还有冲突重复上一步。
当所有空间都查过一遍,发现没有找到,则输出“不存在”。
若该位置空,则输出“不存在”。
若查找到,则输出电话号码。
}( )按地址查找{输入你想要查询的地址,对它进行转换,再查找。
若该位置不空或求得的关键字所对应的数值与该位置的数值不相等,则向后移一位(当移到最后一位,就移到头部继续)。
哈希表的实验报告
哈希表的实验报告哈希表的实验报告哈希表是一种常见的数据结构,用于存储和查找数据。
在本次实验中,我们将探索哈希表的原理、实现和性能,并通过实验验证其效果。
一、实验目的本次实验的目的是探索哈希表的原理和实现方法,并通过实验测试不同哈希函数和哈希表大小对性能的影响。
二、实验原理哈希表是一种基于哈希函数的数据结构,它将数据存储在数组中,通过哈希函数将数据映射到数组的特定位置。
哈希函数将数据转换为数组的索引,使得数据可以快速存储和查找。
哈希函数的选择很重要,一个好的哈希函数应该具备以下特点:1. 均匀性:哈希函数应该将数据均匀地分布到不同的索引位置,以避免冲突。
2. 高效性:哈希函数应该具有高效的计算速度,以提高哈希表的性能。
3. 低冲突:哈希函数应该尽可能减少冲突的发生,以提高哈希表的查找效率。
三、实验方法1. 实现哈希表:我们首先需要实现一个基本的哈希表数据结构。
哈希表可以使用数组来存储数据,每个数组元素称为一个桶,每个桶可以存储多个数据项。
在实现哈希表时,我们需要考虑如何处理冲突,常见的方法有链地址法和开放地址法。
2. 实现哈希函数:我们需要实现不同的哈希函数,以测试它们的性能。
常见的哈希函数包括除余法、乘法和平方取中法等。
我们可以通过实验比较它们的性能,选择最合适的哈希函数。
3. 测试性能:我们需要设计一系列实验,测试不同哈希函数和哈希表大小对性能的影响。
可以通过插入、查找和删除等操作来评估哈希表的性能。
我们可以记录每个操作的平均时间复杂度和空间占用情况,并绘制图表来展示结果。
四、实验结果与分析通过实验,我们得到了不同哈希函数和哈希表大小下的性能数据。
我们可以观察到不同哈希函数对性能的影响,并选择最优的哈希函数。
同时,我们还可以观察到哈希表大小对性能的影响,选择合适的哈希表大小以平衡性能和空间占用。
五、实验总结本次实验我们深入了解了哈希表的原理和实现方法,并通过实验验证了不同哈希函数和哈希表大小对性能的影响。
设计哈希表实现电话号码查询系统
实验五哈希表一、实验目的:设计哈希表实现电话号码查询系统。
基本要求: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;node **nam;node *a;using namespace std; 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];i++; } key2=key2%20; } node* input() {node *temp; temp = new node; temp->next=NULL;cout<<" 输入姓名:"<<endl; cin>>temp->name;cout<<" 输入地址:"<<endl; cin>>temp->address;cout<<" 输入电话:"<<endl; cin>>temp->num;return temp; } int apend() { node *newphone; node *newname; newphone=input(); newname=newphone; newphone->next=NULL; newname->next=NULL;hash(newphone->num); hash2(newname->name); newphone->next = phone[key]->next; phone[key]->next=newphone; newname->next = nam[key2]->next;nam[key2]->next=newname;return 0; } void create() { int i;phone=new pnode[20]; for(i=0;i<20;i++) { phone[i]=new node; phone[i]->next=NULL; } } void create2(){int i;nam=new mingzi[20]; for(i=0;i<20;i++){nam[i]=new node; nam[i]->next=NULL;}}void list(){int i;node *p;for(i=0;i<20;i++) {p=phone[i]->next;while(p) {cout<<" 姓名:"<<p->name<<" 地址:" <<p->address<<" 电话号码:"<<p->num<<endl;p=p->next; } } }void list2(){int i;node *p;for(i=0;i<20;i++){p=nam[i]->next;while(p){cout<<" 姓名:"<<p->name<<" 地址:" <<p->address<<" 电话号码:"<<p->num<<endl;p=p->next;}}}void find(char num[11]){hash(num);node *q=phone[key]->next;while(q!= NULL){if(strcmp(num,q->num)==0)break;q=q->next;}if(q)cout<<" 姓名"<<q->name<<" 地址:" <<q->address<<" 电话号码:"<<q->num<<endl; else cout<<" 无此记录"<<endl;}void find2(char name[8]){hash2(name);node *q=nam[key2]->next; while(q!= NULL){if(strcmp(name,q->name)==0)break;q=q->next;}if(q)cout<<" 姓名"<<q->name<<" 地址:" <<q->address<<" 电话号码:"<<q->num<<endl; else cout<<" 无此记录"<<endl;}void save(){int i;node *p; for(i=0;i<20;i++){ p=phone[i]->next;while(p){fstream iiout("out.txt", ios::out);iiout<<p->name<<"_"<<p->address<<"_"<<p->num<<endl; p=p->next;}}}void menu(){cout<<"1. 添加记录"<<endl;cout<<"2. 查找记录"<<endl;cout<<"3. 姓名散列"<<endl;cout<<"4. 号码散列"<<endl;cout<<"5. 清空记录"<<endl;cout<<"6. 退出系统"<<endl;}int main(){char num[11];char name[8];create();create2() ;int sel;while(1){menu();cin>>sel;if(sel==2){ cout<<"8 姓名查询,9 号码查询"<<endl;int b;cin>>b;if(b==9){ cout<<" 请输入电话号码:"<<endl;cin >>num;cout<<" 输出查找的信息:"<<endl; find(num);}else{ cout<<" 请输入姓名:"<<endl;cin >>name;cout<<" 输出查找的信息:"<<endl;find2(name);}}if(sel==3){cout<<" 姓名散列结果:"<<endl;list2();}if(sel==1){ cout<<" 请输入要添加的内容:"<<endl; apend(); }if(sel==4){ cout<<" 号码散列结果:"<<endl;list();}if(sel==5){ cout<<" 列表已清空:"<<endl;create();create2();}if(sel==6) return 0; }return 0;}。
数据结构 实验9 哈希查找
数据结构实验9 哈希查找数据结构实验9 哈希查找实验目的本实验旨在通过实践来学习哈希查找这一经典的数据结构算法,以及了解其在实际应用中的使用情况。
通过完成本实验,我们可以加深对哈希查找的理解,掌握其基本原理和操作方法。
实验环境- 操作系统:Windows、Linux、MacOS等- 开发工具:任意支持Markdown格式的文本编辑器实验内容1. 概述:哈希查找是一种常用的数据结构和查找算法,通过将关键字进行哈希函数映射,将关键字与存储位置一一对应,可以实现快速的查找操作。
本实验将介绍哈希查找的基本原理和实现方式,以及常见的应用场景。
2. 哈希函数的选择:哈希函数是哈希查找的关键,影响着查找的效率和准确性。
通常情况下,好的哈希函数应该具备均匀分布、低冲突率等特点。
本实验将演示几种常见的哈希函数选取方法,并讨论其优缺点。
3. 哈希冲突的解决:由于哈希函数的映射是有限的,不同的关键字有可能映射到相同的存储位置,即哈希冲突。
本实验将介绍多种哈希冲突解决的方法,包括开放地址法、链地址法等,以及它们的实现原理和适用场景。
4. 实例演示:本实验将通过一个具体的实例来演示哈希查找的应用。
我们将构建一个简单的方式号归属地查询程序,利用哈希查找来快速查询方式号对应的归属地信息。
5. 总结与思考:通过本次实验的学习,我们对哈希查找有了更深入的了解。
在实际应用中,哈希查找具有高效、快速的特点,适用于大量数据的快速查找操作。
同时,我们也意识到哈希函数的选择和冲突解决方法的重要性,需要根据具体场景进行合理选择。
实验步骤1. 概述哈希查找是一种基于哈希表的查找算法,它通过哈希函数将关键字映射到存储位置,以实现快速查找的目的。
哈希查找的时间复杂度为O(1),在理想情况下,可以实现近似常数时间的查找效率。
哈希查找适用于大规模数据的查找,常见应用包括数据库索引、字典等。
2. 哈希函数的选择哈希函数是哈希查找的核心,它将关键字映射到哈希表中的存储位置。
哈希查找数据结构实验报告
引言概述:哈希查找是一种高效的数据结构,它通过将关键字映射为哈希码,将数据存储在哈希表中,从而实现快速的查找操作。
本实验报告将详细介绍哈希查找的原理、实现方法、效率分析以及实验结果,并探讨其在实际应用中的优缺点。
正文内容:一、哈希查找的原理1.1哈希函数的选择1.2冲突处理方法1.3哈希表的结构和特性1.4哈希查找的流程和算法二、哈希查找的实现方法2.1开放寻址法2.1.1线性探测法2.1.2二次探测法2.1.3双重散列法2.2链地质法2.2.1链表的表示与操作2.2.2链地质法的实现步骤2.2.3链地质法的优化方法三、哈希查找的效率分析3.1平均查找长度(ASL)的计算3.2填装因子与性能的关系3.3平均查找长度的简化计算3.4哈希查找的时间复杂度与空间复杂度分析四、实验结果与分析4.1构建哈希表的过程4.2不同冲突处理方法比较4.3不同填装因子下的性能变化4.4实验结果的优化策略4.5实验结果与理论分析的对比五、哈希查找的应用与优缺点5.1应用领域5.2优点与不足5.3哈希查找与其他查找方法的比较5.4未来发展方向和改进方法总结:哈希查找是一种高效的数据结构,它通过将关键字映射为哈希码,将数据存储在哈希表中,实现快速查找。
本文详细介绍了哈希查找的原理、实现方法、效率分析以及实验结果,并探讨了其在实际应用中的优缺点。
通过实验分析和对比,我们可以得出结论:哈希查找在一定填装因子下有着较高的查找效率和较低的空间复杂度,适用于大规模数据的快速查找和插入操作。
哈希查找也存在着冲突处理问题和哈希函数设计的困难等不足之处。
未来的改进方向可以是优化冲突处理方法和进一步提高哈希函数的质量,以提升整体性能和应用范围。
哈希表实现电话号码查询系统
哈希表实现电话号码查询系统一目的利用《数据结构》课程的相关知识完成一个具有一定难度的综合设计题目,利用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、子函数功能intCollision_Random(intkey,inti)//伪随机数探量观测再散列法处理冲突voidInit_HashTable_by_name(stringname,stringphone,stringaddress)//以姓名为关键字建立哈希表intCollision_Rehash(intkey,stringstr)//再哈希法处理冲突voidInit_HashTable_by_phone(stringname,stringphone,stringaddress)//以电话号码为关键字建立哈希表voidOutfile(stringname,intkey)//在没有找到时输出未找到的记录,打开文件out.txt并将记录储存在文档中voidOuthash(intkey)//输出哈希表中的记录voidRafile()//随机生成数据,并将数据保存在new.txtvoidInit_HashTable(char*fname,intn)//建立哈希表intSearch_by_name(stringname)//根据姓名查找哈希表中的记录intSearch_by_phone(stringphone)//根据电话号码查找哈希表中的记录2、函数调用图四详细设计1、主函数流程图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)//伪随机数探量观测再散列法处理冲突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、“伪随机探测再散列处理冲突”伪代码若对应位置上已经存在其他数据,则新的关键字=(原关键字+伪随机数)%哈希表长。
课程设计试验报告-哈希表的设计与实现
数据结构课程设计题目哈希表的设计与实现作者院系信息工程学院专业信息管理与信息系统学号1514210117指导老师张慧答辩时间2016年12月18日目录数据结构课程设计 01系统需求分析 (2)1.1用户需求分析 (2)1.2功能需求分析 (3)1.3数据需求分析 (3)1.4 小结 (4)2系统设计 (4)2.1设计内容及要求 (4)2.2总体设计思路 (4)2.3程序详细设计流程图 (5)2.31以姓名为关键字的Hash()函数流程图 (5)2.32添加结点信息流程图: (7)2.33按姓名查找流程图: (8)2.34按号码查找流程图 (9)2.35主程序流程图 (9)2.4详细设计编码 (11)2.41建立节点 (11)2.42对哈希函数的定义 (11)2.43哈希查找 (12)2.44主函数 (13)3系统测试 (15)3.1上机调试 (15)3.2调试结果与分析 (16)4总结 (20)5附录 (20)1系统需求分析在信息化时代的今天,计算机技术已经是发展到一个很可观的地步了,特别是面向窗口的操作系统的出现,使得程序设计更加的容易了。
在过去计算机内存容量小,CPU计算速度慢,关于程序设计中的数据结构也因此提出来很多的关于解决这方面的问题。
哈希表就是其中之一,哈希表是一个由关键字与值组成的特殊的一种数据结构。
它的出现主要是为了解决在结构中查找记录时需要进行一系列和关键字的比较,这一类查找方法是建立在“比较”的基础上的,在顺序等的查找中,查找的效率是依赖于查找过程中所比较的次数。
理想的情况是希望不经过任何的比较一次存取便能得到所查记录,那就必须在记录的存储位置和它的关键字之间建立一个确定的对应关系,使得每个关键字和结构中一个唯一的存储位置相对应。
因而在查找时只要根据这个对应关系找到给定的值的像。
若结构中存在关键字和该值相等的记录,则所要查找的数就必定就是这个所查找到的记录。
哈希函数是建立哈希表的一个重要的成员,它的构造方法分为以下几种:直接定址法、数字分析法、平方取中法、折叠法、除留余数法、随机数法。
实验16:哈希查找实验报告参考模板
深圳大学实验报告课程名称:数据结构实验与课程设计实验项目名称:哈希查找实验学院:计算机与软件学院专业:软件工程指导教师:杨芳报告人:薛锡增学号:2013150368 班级: 3 实验时间:2014-12-11实验报告提交时间:2014/12/12教务处制一、实验目的1、掌握哈希查找算法的基本思想2、掌握哈希查找表的构造方法3、掌握链表法解决冲突的方法4、掌握哈希查找的时间性能二、实验要求1、熟悉C++语言编程2、了解哈希查找的原理三、实验内容1、问题描述采用散列表方式,对关键字进行查找。
2、查找算法⑴、利用哈希函数(除留余数法,哈希表长为5)及记录的关键字计算出记录的存储地址⑵、直接到指定地址进行查找⑶、如果查找不成功,则采用(表头插入)链地址法,将记录插入到指定地址所在链表的头上。
3、输入⑴、第一行:测试次数。
⑵、每个样本分2行:第一行:第一个数字n表示样本数目,其后跟n个样本;第二行:查找的关键字的值。
4、输出查找是否成功(1—表示成功,0表示不成功),所在位置(从0开始),查找次数。
5、输入样本25 2 4 9 5 746 2 6 8 4 9 176、输出样本1 4 20 2 2四、程序清单#include<iostream>using namespace std;struct node{int data;node* next;node(){next=NULL;}};const int m=11;int main(){node h[15];int n,i,s;node* p;//freopen("cin1.txt","r",stdin);cin>>n;for(i=0;i<n;i++){cin>>s;p=new node();p->data=s;p->next=h[s%11].next;h[s%11].next=p;}int t;cin>>t;while(t--){cin>>s;int sum=1;p=h[s%11].next;while(p){if(s==p->data){cout<<s%11<<" "<<sum<<endl;break;}sum++;p=p->next;}if(!p){cout<<"error"<<endl;p=new node();p->data=s;p->next=h[s%11].next;h[s%11].next=p;}}return0;}五、程序运行时截图流程图:对逐个输入的数据进行除11取余,放到数组相应的位置上输入数据后对其除11取余到数组相应的位置上进行查找,找到就输出数组下标、数组上的第几个结点六、实验心得与体会(实验中遇到的问题及解决方案,或写点感想)哈希查找还没交,对概念不是很懂,在处理问题上也出现不少小细节,不过最后还是做出来了。
哈希查找的判断实验报告
数据结构与算法设计实验报告(2016 — 2017 学年第1 学期)实验名称:年级:专业:班级:学号:姓名:指导教师:成都信息工程大学通信工程学院一、实验目的验证哈希查找算法二、实验要求(1)先创建一个数组类型的顺序表,以—1作为结束。
从键盘输入一组数据元素后,按顺序表的遍历输出,并打印显示。
(2)再以哈希函数方式,将数据元素放入哈希表中,并将哈希表输出,并打印显示。
采用线性探测法处理冲突。
注意:哈希表的下标和数据内容都显示到屏幕上。
(3)输入需要查找的任意元素的关键字,查找并输出该元素的位置下标序列号。
若有冲突,显示它原来的下标位置和新的下标位置。
若没有,也将找不到的信息反馈出来。
注意:用线性探测法处理冲突。
三、实验步骤1、创建工程(附带截图说明)2、根据算法编写程序(参见第六部分源代码)3、编译4、调试四、实验结果图五、心得体会本次实验练习了哈希表的创建与查找,虽然在实验过程中遇到了一些困难,但还是在老师及同学的帮助下顺利完成了。
之前学习C语言的时候基础不是很好,经过几次上级实验以及自己私下的练习,编写程序的过程中已经不会出现语法上的错误,节约了很多时间去思考算法设计。
实验过程中,在设计处理冲突的算法时,出现的漏洞较大,加之自己的逻辑产生混乱,出了很多差错。
在查阅资料后,理清了设计思路,从而解决了问题。
六、源代码要求:粘贴个人代码,以便检查。
#include <stdio.h>#define MAXSIZE#define HASHSIZE 13#define DELFLAG -1/*******关键字*******/typedef struct{int key;}DataType;/*******顺序表*******/typedef struct{DataType items[HASHSIZE];int length;}sqList;/*******哈希表*******/typedef struct{DataType data;int times;}HashTable[HASHSIZE];/*******哈希函数*******/int HashFunc(int key){return key %HASHSIZE;}/*******线性探查法*******/int Collision(int d){return(d+1)%HASHSIZE;}/*******哈希表的查找*******/int HashSearch(HashTable ht,DataType item){int addr;addr=HashFunc(item.key);while(ht[addr].data.key!=NULL&&ht[addr].data.key!=item.key) {printf("\n【%d】冲突地址:%d",item.key,addr);addr=Collision(addr);}if(ht[addr].data.key==item.key){return addr;}else{return -addr;}}/*******哈希表的插入*******/int HashInsert(HashTable ht,DataType item){int addr;addr=HashSearch(ht,item);if(addr>0){return 0;}ht[-addr].data=item;ht[-addr].times=1;return 1;}/*******哈希表的创建*******/void CreatHash(HashTable ht,DataType items[],int n) {int i;for(i=0;i<HASHSIZE;i++){ht[i].data.key=NULL;ht[i].times=0;}for(i=0;i<n;i++){HashInsert(ht,items[i]);}}/*******哈希表的删除*******/int HashDelete(HashTable ht,DataType item) {int addr;addr=HashSearch(ht,item);if(addr>=0){ht[addr].data.key=DELFLAG;return 1;}return 0;}/*******哈希表的显示*******/void DisplayHash(HashTable ht){int i;printf("\n\n哈希表\n\n哈希地址:");for(i=0;i<HASHSIZE;i++){printf("%d\t",i);}printf("\n关键字:\t");for(i=0;i<HASHSIZE;i++){if(ht[i].data.key!=NULL){printf("%d\t",ht[i].data.key);}else{printf("\t");}}printf("\n");}void main(){int i;int addr;int choice;HashTable ht;DataType item;sqList L;for(i=0;i<HASHSIZE;i++){L.items[i].key=0;}L.length=0;printf("\n---------哈希查找-------\n");printf("\n请输入要建立哈希表的关键字序列,以空格分隔,以-1结束\n"); for(i=0;i<HASHSIZE;i++){scanf("%d",&L.items[i].key);if(L.items[i].key==-1){break;}L.length++;}while(1){printf("\n---------哈希查找-------\n");printf("1:哈希表操作\n");printf("0:退出\n");printf("------------------\n");printf("请选择:");scanf("%d",&choice);switch(choice){case 1:{printf("\n顺序表为:");for(i=0;i<L.length;i++){printf("%d ",L.items[i].key);}CreatHash(ht,L.items,L.length);DisplayHash(ht);printf("\n请输入查找元素:");scanf("%d",&item.key);addr=HashSearch(ht,item);if(addr>=0){printf("\n【%d】查找到的地址为:\t%d\n",item.key,addr);}else{printf("\n未找到!\n");}break;}case 0:exit(0);default:{printf("\n错误!请重新输入...\n");break;}}getchar();}}。
实验5 哈希表实验报告
哈希表一、实验目的学会哈希函数的构造方法,处理冲突的机制以及哈希表的查找。
二、实验内容说明以下概念1、哈希函数在一般情况下,需在关键字与记录在表中的存储位置之间建立一个函数关系,以f(key) 作为关键字为key 的记录在表中的位置,通常称这个函数f(key) 为哈希函数。
1) 哈希函数是一个映象,即:将关键字的集合映射到某个地址集合上,它的设置很灵活,只要这个地址集合的大小不超出允许范围即可;2) 由于哈希函数是一个压缩映象,因此,在一般情况下,很容易产生“冲突”现象,即:key1≠ key2,而f(key1) = f(key2)。
2、哈希表根据设定的哈希函数f(key)和处理冲突的方法将一组关键字映像到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“像”作为记录在表中的存储位置,这种表便称为哈希表,这一映像过程称为哈希造表或散列,所得存储位置称哈希地址或散列地址。
3、冲突及处理1)冲突:对不同的关键字可能得到同意哈希地址,即key1≠ key2,而f(key1) = f(key2),这种现象称冲突(collision)。
2)处理方法:开放地址法。
4、哈希表的查找分析从查找过程得知,哈希表查找的平均查找长度实际上并不等于零。
决定哈希表查找的ASL 的因素:1) 选用的哈希函数;2) 选用的处理冲突的方法;3) 哈希表饱和的程度,装载因子 α=n/m 值的大小(n —记录数,m —表的长度)一般情况下,可以认为选用的哈希函数是“均匀”的,则在讨论ASL 时,可以不考虑它的因素。
因此,哈希表的ASL 是处理冲突方法和装载因子的函数。
可以证明:查找成功时有下列结果:线性探测再散列随机探测再散列从以上结果可见哈希表的平均查找长度是α的函数,而不是n 的函数。
这说明,用哈希表)111(21α-+≈nl S )1ln(1αα--≈nr S构造查找表时,可以选择一个适当的装填因子 ,使得平均查找长度限定在某个范围内。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if(nu[j]==q->num[j]) {
a=0; continue; } else { a=1; break; } } if(a==0) { if(i==1) lis[key].lnext=q->next; p->next=q->next; q=NULL; delete q; printf("节点已删除\n"); break; } else { p=q; q=q->next; } if(q==NULL) break; } if(a==1) printf("信息不存在\n"); }
(1)设每个记录有下列数据项:电话号码、用户名、地址;
(2)从键盘输入各记录 ,以电话号码为关键字建立哈希表(至少要有 12 个以上的
记录,哈希表的长度为 8);
(3)采用链地址法解决冲突;
(4)显示建立好的哈希表,对于学有余力的同学可以实现哈希表的查找。
2.实验说明:
(1)采用除留余数法进行哈希表的散列,即以电话号码作为主关键字,将电话号码
3. 插入电话记录。
void createnode() //create or add a new node {
struct node *temp= new node; temp->next=NULL; printf("请输入姓名:\n"); scanf("%s",temp->name); printf("输入电话:\n"); scanf("%s",temp->num); printf("输入地址: \n"); scanf("%s",temp->address); int k=hash(*temp); struct list *p=&lis[k]; if(p->lnext!=NULL)
第 页共 页
华北电力大学实验报告
{ key=key+(int)(nu[i]-'0');
} key=key%7; struct node *q=lis[key].lnext; struct node *p=new nod4;); else {
for(int i=1;;i++) {
int key=0,a=1;
for(int i=0;i<11;i++)
{
key=key+(int)(nu[i]-'0'); }
key=key%7;
struct node *q=lis[key].lnext;
while(q!= NULL)
{ for(int i=0;i<11;i++)
{
if(nu[i]==q->num[i])
temp->next=p->lnext; p->lnext=temp;
第 页共 页
华北电力大学实验报告
} void showlist() //show list {
for(int i=0;i<length;i++) {
struct node *q=lis[i].lnext; printf("Key:%d\n",i); if(!q)
struct node *lnext;//point a record }lis[length]; struct node //record node {
char name[8], address[20]; char num[11]; struct node *next; }; int hash(struct node record) //get key by num { int key=0; for(int i=0;i<11;i++) {
temp->next=p->lnext; p->lnext=temp;
4. 按电话号码查找记录。读入要查找的电话号码,计算得到哈希地址,在相应 的哈希地址中寻找匹配节点,若找到,则输出节点信息,否则,提示未找到 相关信息。
第 页共 页
华北电力大学实验报告
void find(char nu[]) //find the info of a node by num {
华北电力大学
实验报告
| |
实验名称
哈希表
课程名称
数据结构
| |
专业班级:
学生姓名:
学 号:
成 绩:
指导教师:
实验日期:
华北电力大学实验报告
一、实验目的 (1)掌握哈希表的基本操作。 (2)掌握插入、删除、查找等运算,能够灵活应用这种数据存储结构。 二、实验内容及要求
1.实验要求
设计哈希表实现电话号码查询系统。设计程序完成以下要求:
处理信息 : 1. 采用除留余数法进行哈希表的散列,即以电话号码为主关键字,将电话号码 的 11 位相加,按照模 7 取余; 2. 解决冲突用链地址法。
功能设计 : 1. 通过哈希表的构造存储电话号码的相关信息; 2. 能够遍历哈希表,显示所有数据; 3. 通过电话号码查找哈希表,显示与该电话号码有关的所有信息;
第 页共 页
华北电力大学实验报告
} else {
p=q; q=q->next; } if(q==NULL) break; } if(a==1) printf("信息不存在\n"); } } void menu() //choose operation { printf("1.添加记录\n"); printf("2.查找记录\n"); printf("3.号码显示\n"); printf("4.号码删除\n"); printf("5.退出系统\n"); } void main() { struct list lis[length]; for (int i=0;i<length;i++) { lis[i].lnext=NULL; } int sel;//select for operation while(1) { menu(); scanf("%d",&sel); if(sel==1) //add node { createnode(); } if(sel==2) //find info { char numb[11]; printf("请输入电话号码:\n"); scanf("%s",numb); printf("输出查找的信息:\n"); find(numb); } if(sel==3) //show list
{ a=0; continue;
}
else
{ a=1; break;
}
}
if(a==0) {
printf("Key:%d\n",key);
printf("姓名:%s\t 地址:%s\t 电话:%s\n",q->name,q->address,q->num);
break;
} else
q=q->next;
第 页共 页
华北电力大学实验报告
5. 邻接表的构造。 遇到的问题:
哈希地址的求取,以及冲突的解决。 解决方法:哈希地址以电话号码为关键字,将电话号码的 11 位相加,对 7 取模得到哈希 地址。 七、实验代码
#include<stdio.h> #include<string.h> #include<iostream.h> #define length 8 //length of list struct list //list {
key=key+(int)(record.num[i]-'0'); } key=key%7; return key; } void createnode() //create or add a new node { struct node *temp= new node; temp->next=NULL; printf("请输入姓名:\n"); scanf("%s",temp->name); printf("输入电话:\n"); scanf("%s",temp->num); printf("输入地址: \n"); scanf("%s",temp->address); int k=hash(*temp); struct list *p=&lis[k]; if(p->lnext!=NULL)
第 页共 页
华北电力大学实验报告
}
6. 输出所有的信息。
void showlist() //show list {
for(int i=0;i<length;i++) {
struct node *q=lis[i].lnext; printf("Key:%d\n",i); if(!q)
printf("no record now\n"); while(q) {
的 11 位相加,按照模 7 取余;
(2)解决冲突用链地址法。
3.实验数据:
(1)姓名:张三 电话号码:13362589630 地址:保定
(2)姓名:李四 电话号码:15936986542 地址:石家庄…… 三、 实验仪器与设备
计算机,记事本,visual C++6.0 四、问题分析与系统设计