当前位置:文档之家› 哈希表及其应用-课程设计

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

课程设计题目哈希表及其应用教学院计算机学院专业班级姓名指导教师年月日课程设计任务书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 <stdlib.h>#include <fstream>#include <iostream>#include <cmath>using namespace std;#define Maxsize 57struct 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<<"当前文件内已有"<<Number<<"条记录\n";cout<<"请输入添加的个数:";cin>>num;ofstream ofile("telphone.txt",ios::app);if(!ofile) {cout<<"文件打开失败!"; exit(1);}for(i=0;i<num;i++){cout<<"请输入第"<<Number+1<<"个人的姓名"<<endl; cin>>a[Number].name;cout<<"请输入第"<<Number+1<<"个人的电话"<<endl; cin>>a[Number].tel;cout<<"请输入第"<<Number+1<<"个人的地址"<<endl; cin>>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<Number;i++){cout<<" 姓名:"<<a[i].name;cout<<" 电话:"<<a[i].tel;cout<<" 地址:"<<a[i].add<<endl;}}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<Maxsize;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<Number;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<<" 姓名:"<<a[h->elem[address]].name<<endl;cout<<" 电话:"<<a[h->elem[address]].tel<<endl;cout<<" 地址:"<<a[h->elem[address]].add<<endl;cout<<"比较次数为"<<i<<endl;}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<Number;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<<" 姓名:"<<a[h->elem[address]].name<<endl;cout<<" 电话:"<<a[h->elem[address]].tel<<endl;cout<<" 地址:"<<a[h->elem[address]].add<<endl;cout<<"比较次数为"<<i<<endl;}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<Number-1;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<Number-1;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<<endl;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<<endl;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");gotostart;break;case4:Creathash_tel(H,a);system("pause");system("cls");gotostart;break;case5:Search_Name(H,a);system("pause");system("cls");gotostart;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 总结数据结构是计算机学科非常重要的一门必修课程,它与计算机其他课程都有密切联系,具有独特的承上启下的重要位置。

相关主题