哈希表及其应用-课程设计

哈希表及其应用-课程设计
哈希表及其应用-课程设计

课程设计题目哈希表及其应用

教学院计算机学院

专业

班级

姓名

指导教师

年月日

课程设计任务书

2010 ~2010 学年第 1 学期

一、课程设计题目哈希表及其应用

二、课程设计内容

建立一个小型信息管理系统(可以是图书、人事、学生、物资、商品等任何信息管理系统)。要求:

1.使用哈希查找表存储信息;

2.实现查找、插入、删除、统计、输出等功能;

三、进度安排

1.初步完成总体设计,搭好框架;

2.完成最低要求:尝试使用多种哈希函数和冲突解决方法,并通过实际运行测试给出自己的评价

四、基本要求

1.界面友好,函数功能要划分好

2.程序要加必要的注释

3.要提供程序测试方案

教研室主任签名:

年月日

1 概述 (4)

2 设计目的 (4)

3 设计功能说明 (4)

4 详细设计说明 (5)

5 流程图 (5)

6 程序代码 (6)

7 程序运行结果 (15)

8 总结 (19)

参考文献 (19)

成绩评定表 (20)

数据结构是一门理论性强、思维抽象、难度较大的课程,是基础课和专业课之间的桥梁,只有进行实际操作,将理论应用于实际中,才能确实掌握书中的知识点。通过课程设计,不仅可以加深学生对数据结构基本概念的了解,巩固学习成果,还能够提高实际动手能力。为学生后继课程的学习打下良好的基础。

2 设计目的

《数据结构》课程设计是在教学实践基础上进行的一次大型实验,也是对该课程所学理论知识的深化和提高。因此,要求学生能综合应用所学知识,设计与制造出具有较复杂功能的应用系统,并且在实验的基本技能方面上进行一次全面的训练。通过程序的编译掌握对程序的调试方法及思想,并且让学生学会使用一些编程技巧。促使学生养成良好的编程习惯。

1.使学生能够较全面地巩固和应用课堂中所学的的基本理论和程序设计方法,能够较熟练地完成程序的设计和调试。

2.培养学生综合运用所学知识独立完成程序课题的能力。

3.培养学生勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。

4.提高学生对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。

5.培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。

6.对学生掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。

3 设计功能分析

本设计的功能如下:

1、利用哈希函数来实现一个小型信息管理系统,其中信息包含用户名,地址,电话等。

2、能添加用户信息,并能保存该信息。

3、查询管理系统中的信息:可通过姓名查找,也可通过电话查找等两种方式。

4、能散列管理系统中的信息,保存信息等功能。

4 详细设计说明

哈希表是一种重要的存储方式,也是一种常见的检索方法。其基本思想是将关系码的值作为自变量,通过一定的函数关系计算出对应的函数值,把这个数值解释为结点的存储地址,将结点存入计算得到存储地址所对应的存储单元。检索时采用检索关键码的方法。

(1) 假定每个记录有下列数据项:用户名、电话号码、地址。

(2) 初始记录为空,通过不断添加记录,并保存到数据文件telphone.txt

中。

(3) 分别采用线性和平方探测解决冲突。

(4) 查找并显示给定电话号码的记录;查找并显示给定用户

名的记录。

6 程序代码

#include

#include

#include

#include

using namespace std;

#define Maxsize 57

struct record

{char name[20];

char tel[20];

char add[20];};

typedef record *precord;

struct HashTable

{ int elem[Maxsize]; //存放数组a[]的下标

int count;};

typedef HashTable * pHashTable;

int Number; //统计当前数组a[]中的记录总数

void Getdata(precord a) //从文件telphone.txt中读取数据存放到数组a[] { Number=0;

ifstream infile("telphone.txt",ios::in|ios::binary);

if(!infile) {cout<<"文件打开失败!\n"; exit(1);}

while(!infile.eof() && infile.get()!=EOF) //文件不为空并且文件指针没有指到结束符

{infile.seekg(Number*sizeof(a[Number]),ios::beg); //定位文件指针infile.read((char *)&a[Number],sizeof(a[Number]));

Number++;}

infile.close();}

void Add(precord a) //添加记录

{ int i,num;

cout<<"当前文件内已有"<

cout<<"请输入添加的个数:";

cin>>num;

ofstream ofile("telphone.txt",ios::app);

if(!ofile) {cout<<"文件打开失败!"; exit(1);}

for(i=0;i

{cout<<"请输入第"<>a[Number].name;

cout<<"请输入第"<>a[Number].tel;

cout<<"请输入第"<>a[Number].add;

ofile.seekp(ios::end);

ofile.write((char *)&a[Number],sizeof(a[Number])); Number++;}

ofile.close();}

void Print(precord a) //显示所有记录

{ int i;

for(i=0;i

{cout<<" 姓名:"<

cout<<" 电话:"<

cout<<" 地址:"<

}

int Hash(char str[]) //除留取余

{ long val=0;char p[20],*p1;

strcpy(p,str);

p1=p;

while(*p1!='\0')

val=val+*p1++; //将字符串中的所有字符对应的ASCII值相加return(val%Maxsize);

}

int derter; //线性增量

int Line_Sollution(int address) //采用线性探测解决冲突

{

derter++;

if(derter==Maxsize) return(-1);

else return((address+derter)%Maxsize);

}

int n;

int Square_Sollution(int address) //采用平方探测法解决冲突

{ int j;derter++;

if(derter==Maxsize) return -1;

n=n*(-1);

j=(int(pow((float)derter,2))*n+address)%Maxsize;

return(j);}

void Init_Hash(pHashTable h) //初始化哈希表

{ int i;

for(i=0;i

h->elem[i]=-1;

}

int menu;

void Creathash_Name(pHashTable h,precord a)//以员工姓名为关键字创建哈希表

{cout<<"

------------------------------------------------------------------------\n";

cout<<" 1----以线性探测建表\n";

cout<<" 2----以平方探测建表\n";

cout<<"

------------------------------------------------------------------------\n";

int i,address;

cout<<"请选择:";

cin>>menu;

Init_Hash(h);

for(i=0;i

{ derter=0;n=-1;

address=Hash(a[i].name);

while(h->elem[address]!=-1)

{if(menu==1) address=Line_Sollution(address);

else address=Square_Sollution(address);

if(address==-1) break;}

if(address!=-1) { h->elem[address]=i; h->count++;}

}

cout<<"姓名哈希表已成功建立!\n";

}

void Search_Name(pHashTable h,precord a) //查找并显示指定姓名的记录{ cout<<"请输入要查找的姓名:";

char nam[20];int address,i=1;

cin>>nam;

address=Hash(nam);

derter=0;n=-1;

while(h->elem[address]!=-1 && strcmp(nam,a[h->elem[address]].name)!=0) { if(menu==1) address=Line_Sollution(address);

else address=Square_Sollution(address);

i++;

if(address==-1) break;}

if(h->elem[address]!=-1 && strcmp(nam,a[h->elem[address]].name)==0) { cout<<"你要查找的信息为:\n";

cout<<" 姓名:"<elem[address]].name<

cout<<" 电话:"<elem[address]].tel<

cout<<" 地址:"<elem[address]].add<

cout<<"比较次数为"<

else cout<<"无此姓名,查找失败!";

}

void Creathash_tel(pHashTable h,precord a) //以电话号为关键字创建哈希表

{cout<<"

---------------------------------------------------------\n";

cout<<" 1----以线性探测建表\n";

cout<<" 2----以平方探测建表\n";

cout<<"

---------------------------------------------------------\n";

int i,address;

cout<<"请选择:";

cin>>menu;

Init_Hash(h);

for(i=0;i

{ derter=0;n=-1;

address=Hash(a[i].tel);

while(h->elem[address]!=-1)

{if(menu==1) address=Line_Sollution(address);

else address=Square_Sollution(address);

if(address==-1) break;}

if(address!=-1) { h->elem[address]=i; h->count++;}

}

cout<<"电话号码哈希表已成功建立!\n";}

void Search_tel(pHashTable h,precord a)//查找并显示指定电话号的记录{ cout<<"请输入要查找的电话:";

char telphone[20];int address,i=1; //i统计比较次数

cin>>telphone;

address=Hash(telphone);

derter=0; n=-1; //初始化线性增量

while(h->elem[address]!=-1&&

strcmp(telphone,a[h->elem[address]].tel)!=0)

{ if(menu==1) address=Line_Sollution(address);

else address=Square_Sollution(address);

i++;

if(address==-1) break;}

if(h->elem[address]!=-1 && strcmp(telphone,a[h->elem[address]].tel)==0)

{ cout<<"你要查找的信息为:\n";

cout<<" 姓名:"<elem[address]].name<

cout<<" 电话:"<elem[address]].tel<

cout<<" 地址:"<elem[address]].add<

cout<<"比较次数为"<

else cout<<"无此电话,查找失败!";

}

void Delet(pHashTable h,precord a)

{cout<<"

---------------------------------------------------------\n";

cout<<" 1----按电话号码删除\n";

cout<<" 2----按姓名删除\n";

cout<<"

---------------------------------------------------------\n";

int m;

cout<<"请选择:";

cin>>m;

if(m==1)

{cout<<"请输入要删除的电话:";

char telphone[20];

int address,i,j;

cin>>telphone;

address=Hash(telphone);

derter=0; n=-1; //初始化线性增量

while(h->elem[address]!=-1 && strcmp(telphone,a[h->elem[address]].tel)!=0)

{ if(menu==1) address=Line_Sollution(address);

else address=Square_Sollution(address);

if(address==-1) break;}

if(h->elem[address]!=-1&&

strcmp(telphone,a[h->elem[address]].tel)==0)

{j=h->elem[address];

h->elem[address]=-1;

}

for (i=j;i

{strcpy(a[i].name,a[i+1].name);

strcpy(a[i].tel,a[i+1].tel);

strcpy(a[i].add,a[i+1].add);}

Number=Number-1;

}

if(m==2)

{cout<<"请输入要删除的姓名:";

char nam[20];int address,i,j;

cin>>nam;

address=Hash(nam);

derter=0;n=-1;

while(h->elem[address]!=-1 && strcmp(nam,a[h->elem[address]].name)!=0) { if(menu==1) address=Line_Sollution(address);

else address=Square_Sollution(address);

i++;

if(address==-1) break;}

if(h->elem[address]!=-1 && strcmp(nam,a[h->elem[address]].name)==0) { j=h->elem[address];h->elem[address]=-1;}

for (i=j;i

{strcpy(a[i].name,a[i+1].name);

strcpy(a[i].tel,a[i+1].tel);

strcpy(a[i].add,a[i+1].add);}

Number=Number-1;

}

}

void Menu() //功能菜单函数

{cout<

cout<<" 员工管理查询系统\n";

cout<<'\n';

cout<<" ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆\n";

cout<<" ★ 1-------添加☆\n";

cout<<" ☆ 2-------显示所有★\n";

cout<<" ★ 3-------以姓名建立哈希表☆\n";

cout<<" ☆ 4-------以电话号码建立哈希表★\n";

cout<<" ★ 5-------按员工姓名查找☆\n";

cout<<" ☆ 6-------按电话号码查找★\n";

cout<<" ★ 7-------删除员工信息☆\n";

cout<<" ☆ 0-------退出★\n";

cout<<" ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆\n";

cout<<" 使用说明:\n";

cout<<" 1.添加新纪录后,如要进行查找请先进行3或4操作\n"; cout<<" 2.按员工姓名查找之前,请先进行3操作建立用户名哈希表\n";

cout<<" 3.按电话号码查找之前,请先进行4操作建立电话号码哈希表

\n";}

void exit()

{ int i;

for(i=1;i<=4;i++)

cout<

cout<<" ◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◇

◆◇\n";

cout<<" ◆

◆\n";

cout<<" ◇员工管理查询系统

◇\n";

cout<<" ◆

◆\n";

cout<<" ◇谢谢您的使用! ◇\n";

cout<<" ◆

◆\n";

cout<<" ◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆

◇◆\n";

system("pause");}

int main()

{ record a[Maxsize];

pHashTable H=new HashTable;

Getdata(a); //将文件中的数据读入到数组a中

system("color BD");

start:

Menu();

cout<<"请选择:";

int menu1;

cin>>menu1;

switch(menu1)

{ case 0:system("cls");exit();break;

case 1:Add(a);system("pause");system("cls");goto start;break;

case 2:Print(a);system("pause");system("cls");goto start;break;

case3:Creathash_Name(H,a);system("pause");system("cls");goto

start;break;

case4:Creathash_tel(H,a);system("pause");system("cls");goto

start;break;

case5:Search_Name(H,a);system("pause");system("cls");goto

start;break;

case 6:Search_tel(H,a);system("pause");system("cls");goto start;break; case 7:Delet(H,a);system("pause");system("cls");goto start;break; default:cout<<"请输入正确的操作选项!\n";system("cls");goto start;break;}

return 0;

}

7 程序运行结果

主界面

添加记录

显示所有

建立哈希表

查找

删除

退出

8 总结

数据结构是计算机学科非常重要的一门必修课程,它与计算机其他课程都有密切联系,具有独特的承上启下的重要位置。同时数据结构还是一门实践性极强的理论技术基础课。这次数据结构课程设计为我们提供了与众不同的学习方法和学习机会,让我们从被动授学转变为主动求学,从死记硬背的模式中脱离出来,转变为在实践中学习。

在实际的上机操作过程中,不仅是让我们了解数据结构的理论知识,更重要的是培养解决实际问题的能力,所以相信通过此次实习可以提高我们分析设计能力和编程能力,为后续课程的学习及实践打下良好的基础。

参考文献

[1] 苏仕民.数据结构课程设计北京:机械工业出版社.2005

[2] C++面向对象程序设计教程/陈维兴,林小茶编著北京:清华大学出版社,2009.6

[3] C语言版/严蔚敏,吴伟民北京:清华大学出版社,2007

[4] 徐孝凯.数据结构实用教程(C/C++描述)[M]. (第一版)北京:清华大学出版社.1999

[5] 陈慧南.数据结构(使用C++语言描述)[M]. (第一版)南京:东南大学出版社.2001

[6] 殷人昆,陶永雷,谢若阳等.数据结构(用面向对象方法与C++描述)[M]. (第一版)北京:清华大学出版社.1999

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

一: 需求分析 (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;

数据结构课程设计哈希表设计问题复习过程

数据结构课程设计哈希表设计问题

目录 1 前言 (1) 2 需求分析 (1) 2.1 任务和要求 (1) 2.2 运行环境 (1) 2.3 开发工具 (1) 3 分析和设计 (2) 3.1 系统分析及设计思路 (2) 3.2 主要数据结构及算法 (2) 3.3 函数流程图 (2) (1)哈希表的创建及初始化流程图 (2) 5 课程设计总结 (13) 5.1 程序运行结果或预期运行结果 (13) 说明:输入的数为30个姓的拼音,查找的为“pan”,输出的如上图所示。 (14) 5.2 设计结论 (15) 参考文献 (15) 致谢 (15)

1 前言 从C语言产生到现在,它已经成为最重要和最流行的编程语言之一。在各种流行编程语言中,都能看到C语言的影子,如Java的语法与C语言基本相同。学习、掌握C语言是每一个计算机技术人员的基本功之一。 根据本次课程设计的要求,我设计小组将编写一个C语言程序来处理哈希表问题,通过这个程序,将针对自己的班集体中的“人名”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序。 2 需求分析 2.1 任务和要求 针对自己的班集体中的“人名”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序。 要求:假设人名为中国姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数用除留余数法构造,用链表法处理冲突。 2.2 运行环境 (1)WINDOWS2000/XP系统 (2)Visual C++ 6.0编译环境或TC编译环境 2.3 开发工具 C语言

3 分析和设计 3.1 系统分析及设计思路 (1)创建哈希表 (2)姓名(结构体数组)初始化 (1)用除留余数法构建哈希函数 (2)用链表法处理冲突 (3)查找哈希表 在哈希表中进行查找,输出查找的结果和关键字,并计算和输出查找成功的平均查找长度 (4) 显示哈希表 显示哈希表的的格式: 3.2 主要数据结构及算法 定义结构体typedef struct hashtable创建哈希表 定义函数Hash_Init(HashTable ht)来对哈希表初始化 定义函数Hash_Insert(HashTable ht, Node *node)来为哈希表分配地址 定义函数Hash_Init(ht)输入30个名字 定义函数Hash_Create(HashTable ht)来求哈希表长度 定义函数hash_output(HashTable h)来输出哈希表 定义函数Hash_Link()构造链表函数 定义函数int hash_search(int h[],int key)查找输入的名字 3.3 函数流程图 (1)哈希表的创建及初始化流程图

哈 希 常 见 算 法 及 原 理

数据结构与算法-基础算法篇-哈希算法 1. 哈希算法 如何防止数据库中的用户信息被脱库? 你会如何存储用户密码这么重要的数据吗?仅仅 MD5 加密一下存储就够了吗? 在实际开发中,我们应该如何用哈希算法解决问题? 1. 什么是哈希算法? 将任意长度的二进制值串映射成固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。 2. 如何设计一个优秀的哈希算法? 单向哈希: 从哈希值不能反向推导出哈希值(所以哈希算法也叫单向哈希算法)。 篡改无效: 对输入敏感,哪怕原始数据只修改一个Bit,最后得到的哈希值也大不相同。 散列冲突: 散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小。 执行效率: 哈希算法的执行效率要尽量高效,针对较长的文本,也能快速计算哈

希值。 2. 哈希算法的常见应用有哪些? 7个常见应用:安全加密、唯一标识、数据校验、散列函数、负载均衡、数据分片、分布式存储。 1. 安全加密 常用于加密的哈希算法: MD5:MD5 Message-Digest Algorithm,MD5消息摘要算法 SHA:Secure Hash Algorithm,安全散列算法 DES:Data Encryption Standard,数据加密标准 AES:Advanced Encryption Standard,高级加密标准 对用于加密的哈希算法,有两点格外重要,第一点是很难根据哈希值反向推导出原始数据,第二点是散列冲突的概率要小。 在实际开发中要权衡破解难度和计算时间来决定究竟使用哪种加密算法。 2. 唯一标识 通过哈希算法计算出数据的唯一标识,从而用于高效检索数据。 3. 数据校验 利用哈希算法对输入数据敏感的特点,可以对数据取哈希值,从而高效校验数据是否被篡改过。 4. 散列函数 1.如何防止数据库中的用户信息被脱库?你会如何存储用户密码这么重要的数据吗?

哈希表查询设计及实现

/* (1)设计哈希表,该表应能够容纳50个英文单词。 (2)对该哈希表进行查询,实现对特定单词的快速查询,并显示经过的节点内容 已经发到你邮箱里了enochwills@https://www.360docs.net/doc/1f18625411.html, */ #include #include #include #include #include #define szNAME 80 #define HASH_ROOT 47 /*用于计算哈希地址的随机数*/ #define szHASH 50 /*哈希表总长度*/ #define POPULATION 30 /*学生总数*/ /*哈希表结构体*/ struct THash { int key; /*钥匙码*/ char name[10]; /*姓名*/ int depth; /*检索深度*/ }; /*根据钥匙码和哈希根计算哈希地址*/ int GetHashAddress(int key, int root) { return key % root; }/*end GetHashAddress*/ /*冲突地址计算,如果发现地址冲突,则用当前地址和钥匙码、哈希根重新生成一个新地址*/ int GetConflictAddress(int key, int address, int root) { int addr = address + key % 5 + 1; return addr % root; }/*end GetConflictAddress*/ /*根据字符串生成哈希钥匙码,这里的方法是将串内所有字符以数值形式求累加和*/ int CreateKey(char * name) { int key = 0; unsigned char * n = (unsigned char *)name; while(*n) key += *n++; return key; }/*end CreateKey*/ /*输入一个名字,并返回哈希钥匙码*/ int GetName(char * name) { scanf("%s", name); return CreateKey(name); }/*end CreateKey*/ /*根据学生人数、长度和哈希根构造哈希表*/ struct THash * CreateNames(int size, int root, int population) { int i =0, key = 0, addr = 0, depth = 0; char name[10]; struct THash * h = 0, *hash = 0; /*哈希根和长度不能太小*/ if(size < root || root < 2) return 0; /*根据哈希表长度构造一个空的哈希表*/ hash = (struct THash *)malloc(sizeof(struct THash) * size); /*将整个表清空*/ memset(hash, 0, sizeof(struct THash) * size); for(i = 0; i < population; i++) { /*首先产生一个随机的学生姓名,并根据姓名计算哈希钥匙码,再根据钥匙码计算地址*/ key = GetName(name); addr = GetHashAddress(key, root); h = hash + addr; if (h->depth == 0) { /*如果当前哈希地址没有被占用,则存入数据*/ h->key = key; strcpy(h->name , name); h->depth ++; continue; }/*end if*/ /*如果哈希地址已经被占用了,就是说有冲突,则寻找一个新地址,直到没有被占用*/ depth = 0; while(h->depth ) { addr = GetConflictAddress(key, addr, root); h = hash + addr; depth ++; }/*end while*/ /*按照新地址存放数据,同时记录检索深度*/ h->key = key; strcpy(h->name , name); h->depth = depth + 1; }/*next*/ return hash; }/*end CreateNames*/ /*在哈希表中以特定哈希根查找一个学生的记录*/ struct THash * Lookup(struct THash * hash, char * name, int root) { int key = 0, addr = 0; struct THash * h = 0; /*不接受空表和空名称*/ if(!name || !hash) return 0; key = CreateKey(name); addr = GetHashAddress(key, root); h = hash + addr; /*如果结果不正确表示按照冲突规则继续寻找*/ while(strcmp(h->name , name)) { addr = GetConflictAddress(key, addr, root); h = hash + addr; if(h->key == 0) return 0; }/*end while*/ return hash + addr; }/*end Lookup*/ /*根据一条哈希表记录打印该记录的学生信息*/ void Print(struct THash * record) { if (!record) { printf("【查无此人】\n"); return ; }/*end if*/ if(record->depth) printf("【钥匙码】%04d\t【姓名】%s\t【检索深度】%d\n", record->key, record->name, record->depth ); else printf("【空记录】\n"); /*end if*/ }/*end Print*/ /*打印学生花名册*/ void Display(struct THash * hash, int size) { struct THash * h = 0; if (!hash || size < 1) return ; printf("学生花名册:\n"); printf("--------------------\n"); for(h = hash; h < hash + size; h++) { printf("【地址】%d\t", h - hash); Print(h); }/*next*/ printf("--------------------\n"); }/*end Display*/ /*主函数,程序入口*/ int main(void) { /*哈希表变量声明*/ struct THash * hash = 0, * h = 0; int cmd = 0; /*命令*/ char name[10]; /*学生姓名*/ /*生成30个学生用的哈希表*/ hash =

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

实习6、哈希表设计 一、需求分析 1. 问题描述 针对某个集体(比如你所在的班级)中的“人名”设计一个哈希表,使得平均查找长度均不超过R,完成相应的建表和查表顺序。 2. 基本要求 假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数用除留余数法构造,用伪随机探测再散列法处理冲突。 3. 测试数据 取读者周围较熟悉的30个人的姓名。 4. 实现提示 如果随机数自行构造,则应首先调整好随机函数,使其分布均匀。人名的长度均不超过19个字符(最长的人名如:庄双双(Zhuang Shuangshuang))。字符的取码方法可直接利用C 语言中的toascii函数,并可先对过长的人名先作折叠处理。 二、概要设计 ADT Hash { 数据对象D:D是具有相同特征的数据元素的集合。各数据元素均含有类型相同,可唯一标识数据元素的关键字。 数据关系R:数据元素同属一个集合。 InitNameTable() 操作结果:初始化姓名表。 CreateHashTable() 操作结果:建立哈希表。 DisplayNameTable() 操作结果:显示姓名表。 DisplayHashTable() 操作结果:显示哈希表。 FindName() 操作结果:查找姓名。 }ADT Hash 三、详细设计(源代码) (使用C语言) #include #include//time用到的头文件 #include//随机数用到的头文件 #include//toascii()用到的头文件 #include//查找姓名时比较用的头文件 #define HASH_LEN 50//哈希表的长度 #define P 47//小于哈希表长度的P #define NAME_LEN 30//姓名表的长度 typedef struct {//姓名表 char *py; //名字的拼音 int m; //拼音所对应的 }NAME; NAME NameTable[HASH_LEN]; //全局定义姓名表 typedef struct {//哈希表 char *py; //名字的拼音

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

合肥学院 计算机科学与技术系 课程设计报告 2009 ~2010 学年第二学期 课程数据结构与算法 课程设计名称哈希表的设计与实现 学生姓名王东东 学号0804012030 专业班级08计本(2) 指导教师王昆仑、李贯虹 2010 年5 月

课程设计目的 “数据结构与算法课程设计”是计算机科学与技术专业学生的集中实践性环节之一, 是学习“数据结构与算法”理论和实验课程后进行的一次全面的综合练习。其目的是要达到 理论与实际应用相结合,提高学生组织数据及编写程序的能力,使学生能够根据问题要求和 数据对象的特性,学会数据组织的方法,把现实世界中的实际问题在计算机内部表示出来并 用软件解决问题,培养良好的程序设计技能。 一、问题分析和任务定义 1、问题分析 要完成如下要求:设计哈希表实现电话号码查询系统。 实现本程序需要解决以下几个问题: (1)如何定义一个包括电话号码、用户名、地址的节点。 (2)如何以电话号码和用户名为关键字建立哈希表。 (3)用什么方法解决冲突。 (4)如何查找并显示给定电话号码的记录。 (5)如何查找并显示给定用户名的记录。 2 任务定义 1、由问题分析知,本设计要求分别以电话号码和用户名为关键字建立哈希表,z在此基 础上实现查找功能。本实验是要我们分析怎么样很好的解决散列问题,从而建立一比较合理 的哈希表。由于长度无法确定,并且如果采用线性探测法散列算法,删除结点会引起“信息 丢失”的问题。所以采用链地址法散列算法。采用链地址法,当出现同义词冲突时,可以使 用链表结构把同义词链接在一起,即同义词的存储地址不是散列表中其他的空地址。 根据问题分析,我们可以定义有3个域的节点,这三个域分别为电话号码char num[30],姓名char name[30],地址char address[30]。这种类型的每个节点对应链表中的每个节点,其中电话号码和姓名可分别作关键字实现哈希表的创建。 二、数据结构的选择和概要设计 1、数据结构的选择 数据结构:散列结构。 散列结构是使用散列函数建立数据结点关键词与存储地址之间的对应关系,并提供多 种当数据结点存储地址发生“冲突”时的处理方法而建立的一种数据结构。 散列结构基本思想,是以所需存储的结点中的关键词作为自变量,通过某种确定的函 数H(称作散列函数或者哈希函数)进行计算,把求出的函数值作为该结点的存储地址,并 将该结点或结点地址的关键字存储在这个地址中。 散列结构法(简称散列法)通过在结点的存储地址和关键字之间建立某种确定的函数 关系H,使得每个结点(或关键字)都有一个唯一的存储地址相对应。 当需要查找某一指定关键词的结点时,可以很方便地根据待查关键字K计算出对应的“映像”H(K),即结点的存储地址。从而一次存取便能得到待查结点,不再需要进行若干次的 比较运算,而可以通过关键词直接计算出该结点的所在位置。

数据结构课程设计哈希表

数据结构课程设计报告

课题四哈希表查找的设计 1. 任务和功能要求 设哈希表长为20,用除留余数法构造一个哈希函数,以开放定址法中的线性探测再散列法作为解决冲突的方法,编程实现哈希表查找、插入和建立算法。 2. 需求分析 用户输入20个以内的数字存储在哈希表中,并可以在表中查找关键字。3.概要设计 typedef struct { int *key; //关键字 int count; //表长 }HashTable; int creat(HashTable *T) //初始化哈希表 程序调用关系如下: 主函数模块 哈希表初始化模块查询模块 插入模块 4. 详细设计 #include #include

#include #include typedef struct { int *key; //关键字 int count; //表长 }HashTable; int search(HashTable *T,int k) //初始化哈希表 { int a; a=k%13; while(a<20) { if(T->key[a]==k) break; a++; } if(a<20) return a; else return 0; } void insert(HashTable *T,int k) { int i,j; i=search(T,k); if(i!=0) printf(" 关键字已存在于位置%d",i); else { j=k%13; while(j<20) { if(T->key[j]==0) { T->key[j]=k;break; } else j++; } } }

数据结构哈希表设计

一、问题描述 针对某个集体(比如你所在的班级)中的“人名”设计一个哈希表,使得平均查找长度均不超过R,完成相应的建表和查表顺序。 二、基本要求 假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数用除留余数法构造,用伪随机探测再散列法处理冲突。 三、概要设计 1.构造结构体:typedef struct{}; 2.姓名表的初始化:void InitNameTable(); 3.建立哈希表:void CreateHashTable(); 4.显示姓名表:void DisplayNameTable(); 5.姓名查找:void FindName(); 6.主函数:void main() ; 四、详细设计 1.姓名表的初始化 void InitNameTable() { NameTable[0].py="louyuhong"; NameTable[1].py="shenyinghong"; NameTable[2].py="wangqi"; NameTable[3].py="zhuxiaotong"; NameTable[4].py="zhataotao"; NameTable[5].py="chenbinjie"; NameTable[6].py="chenchaoqun"; NameTable[7].py="chencheng"; NameTable[8].py="chenjie"; NameTable[9].py="chenweida";

NameTable[10].py="shanjianfeng"; NameTable[11].py="fangyixin"; NameTable[12].py="houfeng"; NameTable[13].py="hujiaming"; NameTable[14].py="huangjiaju"; NameTable[15].py="huanqingsong"; NameTable[16].py="jianghe"; NameTable[17].py="jinleicheng"; NameTable[18].py="libiao"; NameTable[19].py="liqi"; NameTable[20].py="lirenhua"; NameTable[21].py="liukai"; NameTable[22].py="louhanglin"; NameTable[23].py="luchaoming"; NameTable[24].py="luqiuwei"; NameTable[25].py="panhaijian"; NameTable[26].py="shuxiang"; NameTable[27].py="suxiaolei"; NameTable[28].py="sunyubo"; NameTable[29].py="wangwei"; for (i=0;i

哈 希 常 见 算 法 及 原 理

计算与数据结构篇 - 哈希算法 (Hash) 计算与数据结构篇 - 哈希算法 (Hash) 哈希算法的定义和原理非常简单,基本上一句话就可以概括了。将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。 构成哈希算法的条件: 从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法)对输入数据非常敏感,哪怕原始数据只修改了一个 Bit,最后得到的哈希值也大不相同; 散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小; 哈希算法的执行效率要尽量高效,针对较长的文本,也能快速地计算出哈希值。 哈希算法的应用(上篇) 安全加密 说到哈希算法的应用,最先想到的应该就是安全加密。最常用于加密的哈希算法是 MD5(MD5 Message-Digest Algorithm,MD5 消息摘要算法)和 SHA(Secure Hash Algorithm,安全散列算法)。 除了这两个之外,当然还有很多其他加密算法,比如 DES(Data Encryption Standard,数据加密标准)、AES(Advanced Encryption Standard,高级加密标准)。

前面我讲到的哈希算法四点要求,对用于加密的哈希算法来说,有两点格外重要。第一点是很难根据哈希值反向推导出原始数据,第二点是散列冲突的概率要很小。 不过,即便哈希算法存在散列冲突的情况,但是因为哈希值的范围很大,冲突的概率极低,所以相对来说还是很难破解的。像 MD5,有 2^128 个不同的哈希值,这个数据已经是一个天文数字了,所以散列冲突的概率要小于 1-2^128。 如果我们拿到一个 MD5 哈希值,希望通过毫无规律的穷举的方法,找到跟这个 MD5 值相同的另一个数据,那耗费的时间应该是个天文数字。所以,即便哈希算法存在冲突,但是在有限的时间和资-源下,哈希算法还是被很难破解的。 对于加密知识点的补充,md5这个算法固然安全可靠,但网络上也有针对MD5中出现的彩虹表,最常见的思路是在密码后面添加一组盐码(salt), 比如可以使用md5(1234567.'2019@STARK-%$#-idje-789'),2019@STARK-%$#-idje-789 作为盐码起到了一定的保护和安全的作用。 唯一标识(uuid) 我们可以给每一个图片取一个唯一标识,或者说信息摘要。比如,我们可以从图片的二进制码串开头取 100 个字节,从中间取 100 个字节,从最后再取 100 个字节,然后将这 300 个字节放到一块,通过哈希算法(比如 MD5),得到一个哈希字符串,用它作为图片的唯一标识。通过这个唯一标识来判定图片是否在图库中,这样就可以减少很多工作量。

数据结构课设-通讯录系统的设计与实现——哈希表

课程设计(论文)任务书 软件学院学院软件工程专业班 一、课程设计(论文)题目:通讯录管理系统的设计与实现——哈希表 二、课程设计(论文)工作自2016 年 1 月 4 日起至 2016 年 1 月 10 日止 三、课程设计(论文) 地点: 软件测试中心(北区测试二室) 四、课程设计(论文)内容要求: 1.本课程设计的目的 ⑴训练学生灵活应用所学数据结构知识,独立完成问题分析,结合课程的理论知识,编写程序求解指定问题; ⑵初步掌握软件开发过程的问题分析、系统设计、编码、测试等基本方法和技能; ⑶提高综合运用所学的理论知识和方法独立分析和解决问题的能力,巩固、深化学生的理论知识,提升编程水平。 2.课程设计的任务及要求 1)基本要求: ⑴要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编写上机程序和上机调试等若干步骤完成题目,最终写出完整的报告; ⑵在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率; ⑶程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释; ⑷每位同学需提交可独立运行的程序和规范的课程设计报告。 2)课程设计论文编写要求 ⑴理论设计部分以课程设计论文的形式提交,格式必须按照课程设计论文标准格式进行书写和装订; ⑵课程设计报告包括中文目录、设计任务、需求分析、概要设计、详细设计、编码实现、调试分析、课设总结、谢辞、参考文献、附录等; ⑶设计部分应包含系统功能模块图,调试分析应包括运行截图等。 3)课程设计评分标准: ⑴学习态度:10分; ⑵系统设计:20分; ⑶编程调试:20分; ⑷回答问题:20分; ⑸论文撰写:30分。

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

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

实习6、哈希表设计 一、需求分析 1. 问题描述 针对某个集体(比如你所在的班级)中的“人名”设计一个哈希表,使得平均查找长度均不超过R,完成相应的建表和查表顺序。 2. 基本要求 假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数用除留余数法构造,用伪随机探测再散列法处理冲突。 3. 测试数据 取读者周围较熟悉的30个人的姓名。 4. 实现提示 如果随机数自行构造,则应首先调整好随机函数,使其分布均匀。人名的长度均不超过19个字符(最长的人名如:庄双双(Zhuang Shuangshuang))。字符的取码方法可直接利用C语言中的toascii函数,并可先对过长的人名先作折叠处理。 二、概要设计 ADT Hash { 数据对象D:D是具有相同特征的数据元素的集合。各数据元素均含有类型相同,可唯一标识数据元素的关键

字。 数据关系R:数据元素同属一个集合。 InitNameTable() 操作结果:初始化姓名表。 CreateHashTable() 操作结果:建立哈希表。 DisplayNameTable() 操作结果:显示姓名表。 DisplayHashTable() 操作结果:显示哈希表。 FindName() 操作结果:查找姓名。 }ADT Hash 三、详细设计(源代码) (使用C语言) #include #include//time用到的头文件 #include//随机数用到的头文件 #include//toascii()用到的头文件 #include//查找姓名时比较用的头文件#define HASH_LEN 50//哈希表的长度

哈希表查找成功和不成功的算法

哈希表查找不成功怎么计算? 解答:先建好表,然后可以算出每个位置不成功时的比较次数之和,再除以表空间个数! 例如:散列函数为hash(x)=x MOD 13,用线性探测,建立了哈希表之后,如何求查找不成功时的平均查找长度!? 地址:0 1 2 3 4 5 6 7 8 9 10 11 12 数据: 39 1228154244 625-- 36- 38 成功次数: 1 3 1 2 2 1 191 1 不成功次数:98 7 65 4 3 2 1 1 2 110 查找成功时的平均查找长度:ASL=(1+3+1+2+2+1+1+9+1+1)/10 =2.2 查找不成功时的平均查找长度:ASL=(9+8+7+6+5+4+3+2+1+1+2+1+10)/13=4.54 说明: 第n个位置不成功时的比较次数为,第n个位置到第1个没有数据位置的距离。至少要查询多少次才能确认没有这个值。 (1)查询hash(x)=0,至少要查询9次遇到表值为空的时候,才能确认查询失 败。 (2)查询hash(x)=1,至少要查询8次遇到表值为空的时候,才能确认查询失 败。 (3)查询hash(x)=2,至少要查询7次遇到表值为空的时候,才能确认查询失 败。 (4)查询hash(x)=3,至少要查询6次遇到表值为空的时候,才能确认查询失 败。 (5)查询hash(x)=4,至少要查询5次遇到表值为空的时候,才能确认查询失 败。 (6)查询hash(x)=5,至少要查询4次遇到表值为空的时候,才能确认查询失 败。

(7)查询hash(x)=6,至少要查询3次遇到表值为空的时候,才能确认查询失败。 (8)查询hash(x)=7,至少要查询2次遇到表值为空的时候,才能确认查询失败。 (9)查询hash(x)=8,至少要查询1次遇到表值为空的时候,才能确认查询失败。 (10)查询hash(x)=9,至少要查询1次遇到表值为空的时候,才能确认查询失败。 (11)查询hash(x)=10,至少要查询2次遇到表值为空的时候,才能确认查询失败。 (12)查询hash(x)=11,至少要查询1次遇到表值为空的时候,才能确认查询失败。 (13)查询hash(x)=12,至少要查询10次遇到表值为空(循环查询顺序表)的时候,才能确认查询失败。 下面看下2010年2010年全国硕士研究生入学统一考试计算机科学与技术学科联考计算机学科专业基础综合试题中一个考哈希表的题。 Question1: 将关键字序列(7、8、30、11、18、9、14)散列存储到散列表中。散列表的存储空间是一个下标从0开始的一维数组,散列函数为:H(key) = (keyx3) MOD 7,处理冲突采用线性探测再散列法,要求装填(载)因子为0.7。 (1) 请画出所构造的散列表。 (2) 分别计算等概率情况下查找成功和查找不成功的平均查找长度。 Ans: (1).首先明确一个概念装载因子,装载因子是指所有关键子填充哈希表后饱和的程度,它等于关键字总数/哈希表的长度。根据题意,我们可以确定哈希表的长度为 L = 7/0.7 = 10;因此此题需要构建的哈希表是下标为0~9的一维数组。根据散列函数可以得到如下散列函数值表。 H(Key) = (keyx3) MOD 7, 例如key=7时, H(7) = (7x3)%7 = 21%7=0,其他关键字同理。

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

福建工程学院 课程设计 课程:算法与数据结构 题目:哈希表 专业:网络工程 班级:xxxxxx班 座号:xxxxxxxxxxxx 姓名:xxxxxxx 2011年12 月31 日 实验题目:哈希表 一、要解决的问题 针对同班同学信息设计一个通讯录,学生信息有姓名,学号,电话号码等。以学生姓名为关键字设计哈希表,并完成相应的建表和查表程序。 基本要求:姓名以汉语拼音形式,待填入哈希表的人名约30个,自行设计哈希函数,用线性探测再散列法或链地址法处理冲突;在查找的过程中给出比较的次数。完成按姓名查询的操作。 运行的环境:Microsoft Visual C++ 6.0 二、算法基本思想描述 设计一个哈希表(哈希表内的元素为自定义的结构体)用来存放待填入的30个人名,人名为中国姓名的汉语拼音形式,用除留余数法构造哈希函数,用线性探查法解决哈希冲突。建立哈希表并且将其显示出来。通过要查找的关键字用哈希函数计算出相应的地址来查找人名。通过循环语句调用数组中保存的数据来显示哈希表。 三、设计 1、数据结构的设计和说明 (1)结构体的定义 typedef struct //记录 { NA name; NA xuehao; NA tel; }Record;

{ 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=0) return q; else i=c/2+1; } else{ q=(p-i*i)%HASHSIZE; c++;

哈希表的设计与实现

令胆嗲院 计算机科嗲b练水系 课程设计报告 2007 2008 学年第 2 学期 课程数据结构与算法 课程设计名称哈希表的设计与实现 学生姓名 学号0604011026 专业班级06计科(1) 指导教师 2008 年9 月

课程设计题目: (哈希表的设计与实现的问题〉设计哈希表实现电话号码查询系统。设计程序完成以下要求:(1)设每个记录有下列数据项:电话号码、用户名、地址:(2)从键盘输入各记录,分别以电话号码和用户名为关键字建立晗希表;(3)采用再哈希法解决冲突;(4)查找并显示给定电话号码的记录:(5)查找并显示给定用户的记录。 一、问题分析和任务定义 1、问题分析 要完成如下要求:设计晗希表实现电话号码查询系统。实现本程序需要解决以下几个问题: (1) 如何设计一个结点使该结点包括电话号码、用户名、地址。 (2) 如何分别以电话号码和用户名为关键字建立哈希表。 (3) 如何利用再晗希法解决冲突。 (4) 如何实现用晗希法查找并显示给定电话号码的记录。 (5) 如何查找并显示给定用户的记录。 2、任务定义 由问题分析知,本设计主要要求分别以电话号码和用户名为关键字建立晗希表,并实现查找功能。所以本设计的核心问题是如何解决散列的问题,亦即设计一个良好的哈希表。由于结点的个数无法确认,并且如果采用线性探测法散列算法,删除结点会引起“信息丢失”的问题。所以采用链地址法散列算法。采用链地址法,当出现同义词冲突时,使用链表结构把同义词链接在一起,即同义词的存储地址不是散列表中其他的空地址。 决的是定义链表结点,在链地址法中,每个结点对应一个链表结点,它由三个首先,解 域组成,而由于该程序需要分别用电话号码和用户名为关键字建立晗希表,所以该链表结点它是由四个域组成.name[8]、num[ll]和address[20]都是char浮点型,输入输出都只能是浮点型的。 采用链地址法,其中的所有同义词构成一个单链表,再由一个表头结点指向这个单链表的第一个结点。这些表头结点组成一个一维数组,即哈希表。数组元素的下标对应由散列函数求出的散列地址。

哈希表及其应用-课程设计

课程设计题目哈希表及其应用 教学院计算机学院 专业 班级 姓名 指导教师 年月日

课程设计任务书 2010 ~2010 学年第 1 学期 一、课程设计题目哈希表及其应用 二、课程设计内容 建立一个小型信息管理系统(可以是图书、人事、学生、物资、商品等任何信息管理系统)。要求: 1.使用哈希查找表存储信息; 2.实现查找、插入、删除、统计、输出等功能; 三、进度安排 1.初步完成总体设计,搭好框架; 2.完成最低要求:尝试使用多种哈希函数和冲突解决方法,并通过实际运行测试给出自己的评价 四、基本要求 1.界面友好,函数功能要划分好 2.程序要加必要的注释 3.要提供程序测试方案 教研室主任签名: 年月日

1 概述 (4) 2 设计目的 (4) 3 设计功能说明 (4) 4 详细设计说明 (5) 5 流程图 (5) 6 程序代码 (6) 7 程序运行结果 (15) 8 总结 (19) 参考文献 (19) 成绩评定表 (20)

数据结构是一门理论性强、思维抽象、难度较大的课程,是基础课和专业课之间的桥梁,只有进行实际操作,将理论应用于实际中,才能确实掌握书中的知识点。通过课程设计,不仅可以加深学生对数据结构基本概念的了解,巩固学习成果,还能够提高实际动手能力。为学生后继课程的学习打下良好的基础。 2 设计目的 《数据结构》课程设计是在教学实践基础上进行的一次大型实验,也是对该课程所学理论知识的深化和提高。因此,要求学生能综合应用所学知识,设计与制造出具有较复杂功能的应用系统,并且在实验的基本技能方面上进行一次全面的训练。通过程序的编译掌握对程序的调试方法及思想,并且让学生学会使用一些编程技巧。促使学生养成良好的编程习惯。 1.使学生能够较全面地巩固和应用课堂中所学的的基本理论和程序设计方法,能够较熟练地完成程序的设计和调试。 2.培养学生综合运用所学知识独立完成程序课题的能力。 3.培养学生勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。 4.提高学生对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。 5.培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。 6.对学生掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。 3 设计功能分析 本设计的功能如下: 1、利用哈希函数来实现一个小型信息管理系统,其中信息包含用户名,地址,电话等。 2、能添加用户信息,并能保存该信息。 3、查询管理系统中的信息:可通过姓名查找,也可通过电话查找等两种方式。

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

福建工程学院课程设计 课程:算法与数据结构 题目:哈希表 专业:网络工程 班级:xxxxxx班 座号:xxxxxxxxxxxx 姓名:xxxxxxx 2011年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)姓名的折叠处理

相关文档
最新文档