设计哈希表实现查询系统
一﹑目的
通过课程设计,巩固和加深对结构体、文件、哈希表等理论知识的理解;掌握现实复杂问题的分析建模和解决方法,掌握包括问题描述、系统分析、设计建模、代码实现、结果分析等的方法;提高利用计算机分析解决综合性实际问题的基本能力;锻炼个人动手能力,历练自身素质。
哈希表实现查询系统是利用哈希表实现系统的快速查询,程序实现哈希表建表和查表,并实现对没有查到的内容进行记录。掌握哈希表的工作原理,熟悉建立哈希表、对哈希表冲突处理、哈希表查等功能的实现,回顾文件读取、写入,回顾随机函数的作用。二﹑需求分析
1.输入的形式和输入值的范围
数据输入分两种模式:一种是将原有数据记录在文档中,由程序读入;另一种是由程序随机生成,并储存在文档中。数据的格式为:##、、家庭住址。
用户使用时显示菜单,用户输入菜单选项完成操作。
2.输出的形式
查的结果显示在屏幕上。未被查到的内容输出到文档中。在用户需要时,将哈希表显示在屏幕上。
3.程序所能达到的功能
根据用户的选择,从原有文档读入数据或随机生成数据,分别以##和做为关键字生成哈希表。生成哈希表后用户可以根据相应关键字进行数据的查,若查到对应的数据则将数据输出到屏幕,若没有查到对应的数据则将用户输入的查内容输出到文档。在用户选择显示哈希表时,显示完整的哈希表。
程序使用文字菜单的友好界面。在数据输入时对输入内容进行范围控制。
4.初步测试计划
在文档中输入30条记录,令程序读入并分别以##和做为关键字生成哈希表,查记录中原有的记录,查看输出数据,查记录中没有的记录查看回馈,查看整个哈希表的数据。
令程序随机生成记录,查看文档,分别以##和做为关键字生成哈希表,查看整个哈希表的数据,分别查原有和没有的记录,查看回馈。
三﹑概要设计
1.数据类型
定义结构体类型存储每条记录。
c++课程设计报告
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)//在没有到时输出未到的记录,打开文件并将记录储存在文档中
void Allshow()//输出哈希表中的记录
void Auto_file()//随机生成数据,并将数据保存在
void 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 40
3.获取关键字函数
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)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。