哈希表实现号码查询实验报告
哈希查找的实现与分析报告(顺序).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、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间: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 四、问题分析与系统设计