1、 *课程设计报告课程设计报告 题目:题目: 散列表的设计与实现散列表的设计与实现 2012 年年 6 月月 1 日日 目录目录 1. 需求分析说明需求分析说明1 2. 总体设计总体设计1 3. 详细设计详细设计3 4. 实现部分实现部分3 5. 程序测试程序测试9 6. 总结总结13 1.需求分析说明:需求分析说明:【问题描述】 设计散列表实现电话号码查找系统。 【基本要求】 1) 设每个记录有下列数据项:电话号码、用户名、地址; 2) 从键盘输入各记录,分别以电话号码和用户名为关键字建立散列 表; 3) 采用一定的方法解决冲突; 4) 查找并显示给定电话号码的记录; 5) 查找并显示给定用户
2、名的记录。 【进一步完成内容】 1) 系统功能的完善; 2) 设计不同的散列函数,比较冲突率; 3) 在散列函数确定的前提下, 尝试各种不同类型处理冲突的方法, 考 察平均查找长度的变化。 2.总体设计:总体设计: 就总体上来说, 用散列表来实现电话号码查找必须先输入一些电 话号码作为数据库,然后可以通过姓名或者号码来查找, 每个输入的 数据必须包括姓名,地址及号码。具体的步骤如下图所示 输入和添加数据输入和添加数据 保存所添加的数据及选择所 需要的功能 选择查找所需的数据选择查找所需的数据 判断是否判断是否存存 在这些数据在这些数据 存存 在在 姓姓 名名 散散 列列 号号 码码 散散 列列
3、 没没 有有 根 据 姓 名根 据 姓 名 输出数据输出数据 根 据 号 码根 据 号 码 输出数据输出数据 3.详细设计:从需要给指定的函数需求创建类,到主函数及详细设计:从需要给指定的函数需求创建类,到主函数及 界面的功能实现,都必须根据需求分析来做。界面的功能实现,都必须根据需求分析来做。 先给所需要用到的头文件定义以及散列函数用到的关键数 key, 进而定义输入时的姓名,地址,号码和节点的指针定义,接着定义两 个 Hash 函数,是姓名和号码所要用到的散列排序的函数,其中包括 处理地址冲突的关键式子 key=key%20.紧接着定义个 input 函数,为 输入节点创建空间,和下面定义
4、的 apend 函数对应,apend 函数是为 接下来的节点创建空间。可以创建两个 create 函数,为后面主函数的 清空功能所用,create1 用于清空姓名,create2 用于清空号码和地址。 在创建两个 list 函数,list1 用于列出根据姓名散列的出的结果,list2 用于根据号码散列的出的结果。进而创建两个 find 函数,fand1 函数 用于根据姓名查找,find2 用于根据号码查找。最后定义一个 save 函 数,用于保存数据,和一个 menu 函数,用于界面的选择。 4.实现部分:实现部分: #include “iostream.h“ #include “string
5、.h“ #include “fstream.h“ #define NULL 0 unsigned int key; unsigned int key2; int *p; struct node char name8,address20; char num11; node * next; ; typedef node* pnode; typedef node* mingzi; node *phone; node *nam; node *a; void hash(char num11) int i = 3; key=(int)num2; while(numi!=NULL) key+=(int)numi; i+; key=key%20; void hash2(char name8) int i = 1; key2=(int)name0; while(namei!=NULL) key2+=(int)namei; i+; key2=key2%20; node* input() node *temp; temp = new node; temp-next=NULL; couttemp-name; co