设计哈希表实现电话号码查询系统C语言版课程设计报告Word下载.docx
《设计哈希表实现电话号码查询系统C语言版课程设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《设计哈希表实现电话号码查询系统C语言版课程设计报告Word下载.docx(29页珍藏版)》请在冰豆网上搜索。
charaddress[sizeaddress];
boolused;
}*hash_data;
2各种函数说明:
intget_hashkey(char*str,intselect)//获得关键字
voidshow(inti)//显示每条信息
voidStore(char*str)//在没有找到时输出未找到的记录,打开文件out.txt并将记录储存在文档中
voidAllshow()//输出哈希表中的记录
voidAuto_file()//随机生成数据,并将数据保存在new.txt
voidBuild_Hash(intHashType)//建立哈希表
voidFindName()//根据##查找哈希表中的记录
voidFindPhone()//根据查找哈希表中的记录
四﹑详细设计
1.头文件与定义结构体类型
#include<
time.h>
stdio.h>
string.h>
stdlib.h>
stringname;
//
stringphone;
stringaddress;
};
Data*hash_data;
2.定义长度
#definesizehash100
#definesizename20
#definesizephone15
#definesizeaddress40
3.获取关键字函数
intget_hashkey(char*str,intselect)
{
intKey=0,ReKey,m;
chartmp[10];
for(inti=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;
10;
{
ReKey=(m+A[i])%sizehash;
if(!
hash_data[ReKey].used)
{
Key=ReKey;
break;
}
}
}elseif(select==2)
ReKey=m;
for(i=0;
100;
i++)
{ReKey=ReKey+1;
ReKey=ReKey%sizehash;
}
returnKey;
}
4.产生hash表
voidBuild_Hash(intHashType){
sizehash;
i++)hash_data[i].used=false;
FILE*reader=fopen(DataFile,"
r"
);
if(reader==NULL)
printf("
%s读取失败\n"
DataFile);
fclose(reader);
exit
(1);
chars[100];
charseps[]="
\t"
;
char*name;
char*phone;
char*address;
intHashKey;
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);
}elseif(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;
5.在没有找到时输出未找到的记录,打开文件out.txt并将记录储存在文档中
voidStore(char*str)//将查找失败记录添加到out.txt文件末尾
FILE*pf=fopen("
out.txt"
"
wa"
//以追加的方式写入
if(pf==NULL)//判断文件是否打开成功
创建out.txt失败\n"
fclose(pf);
fscanf(pf,"
%s"
str);
6.输出哈希表中的记录
voidAllshow()
if(hash_data[i].used)
show(i);
printf("
\n\n"
7.随机生成数据,并将数据保存在new.txt
voidAuto_file()
FILE*fp=fopen("
new.txt"
"
w+"
writer.open("
if(fp==NULL)
printf("
创ä
¡
ä
建¡
§
new.txt失º
ì
败ã
¨
¹
!
fclose(fp);
chars[100]={0};
intk=0;
srand(time(0));
50;
memset(s,0,100);
k=0;
//随?
机¨
²
产¨
生¦
用®
?
户¡
名?
for(intj=0;
j<
8;
j++,k++)
s[k]='
a'
+rand()%26;
电Ì
话¡
ã
号?
码?
s[k++]='
\t'
for(j=0;
12;
0'
+rand()%10;
地Ì
址¡
¤
20;
fprintf(fp,"
s);
if(i!
=49)
\n"
fclose(fp);
8.根据##查找哈希表中的记录
intFind_by_name(stringname)
inti=0;
intj=1;
intkey;
char*p;
for(key=0,p=&
name[0];
*p;
p++)
key=key+*p;
key=key%43;
while
(1)
if(sign[key]=='
&
key<
=42)
{key++;
j++;
if(hash_data[key].name==name)
returnkey;
else
key=Handle_Random(key,i);
j++;
if(j==num)
return-1;
9.根据用户名查找记录
voidFindName(){
charname[10]="
"
请输入要查找的用户名:
scanf("
name);
inti=Find(name,1);
if(i==-1)
无此记录\n"
Store(name);
}else{
查找结果:
show(i);
10.根据查找记录
voidFindPhone(){
charphone[12]="
请输入要查找的:
phone);
inti=Find(phone,2);
无此记!
Store(phone);
12.整个程序的流程图如下
五﹑调试分析
1.测试环境
在Windows7环境下的VisualC++6.0。
2.模块调试
随机生成数据时,对随机生成的内容的控制需要特别注意。
要注意其字符组合模式,比如生成名字是应该只有字幕,生成是应该只有数字,在随机生成是用ASCII码的规律解决。
还要注意生成字符组合的长度限制,比如应该是11位,这可以在循环语句中进行控制。
在哈希含查找时要注意取余的除数的一致,这是哈希表成立的关键点。
3.复杂度分析
使用哈希表存储记录,在执行查找是可以快捷的进行查找。
程序选用了除留余数法建立哈希函数,选用在哈希法和为随机探测再散列法。
程序设定的哈希标长为50,文件数据长度为30,则哈希表的填装因子α为0.6,则查找成功时的平均查找长度为Snr≈-In〔1-0.6〕
查找不成功时的平均查找长度为Unr≈
六﹑测试结果
1菜单:
运行软件后会出现主菜单,然后可以根据上面的提示,选择相应操作。
2以##或者查询old.txt文件中的数据:
按照提示输入##查找:
第一步输入文件中没有的##kjhyuio查找结果显示无此记录。
第二步输入hefangfang就立刻显示出正确信息。
第三步显示以##为关键字建立的哈希表。
第四步输入0退出程序。
第二步输入文件中没有的1332455查找结果显示输入不正确。
第三步显示以为关键字建立的哈希表。
3以##或者查询new.txt文件中的数据:
第一步输入文件中没有的##dbfgdswe查找结果显示无此记录。
第二步输入wfnfozvs就立刻显示出正确信息。
第二步输入20973726016查找结果显示正确信息。
七﹑用户使用说明
本程序运行在Windows7系统下。
程序为命令提示行文件,执行文件前请在程序同目录下的old.txt文件中输入原始数据。
程序生成的文档文件也将存放在程序同目录下。
打开程序后请根据提示选择功能。
输入“1〞程序将使用程序同目录下的old.txt文件中的数据;
输入“2〞程序将随机生成数据;
输入“0〞则会结束程序。
输入“1〞表明用##做为关键字进行查找;
输入“2〞表明用做为关键字进行查找;
用##〔〕查找时
输入“1〞用户将需要输入##〔〕进行查找;
输入“2〞程序将显示完整的哈希表;
用户输入##查找后,若有这条记录,程序将显示该条记录。
若未找到这条记录,则显示“没有找到这条记录!
〞,同时将输入记录在程序同目录下的out.txt文件中。
选择随机生成随据,数据同时将输出在程序同目录下的new.txt文件中。
八﹑课程设计总结
1编程前遇到一些小问题:
由于C语言我们现在学的比较浅,所以编程都是自己通过网上学习或者请教同学,对于文件应用方面我了解甚少,但是经过自己自行学习文件知识后,了解了文件方面相应的知识。
开始时程序出现了一些问题,经过修改和完善,终于解决了每个问题,使程序新建或打开文件非常好。
通过努力也把文件应运得很好。
2心得:
通过此次课程设,我巩固和加深了对哈希表、文件等理论知识的理解;
掌握现实复杂问题的分析建模和解决方法;
也提高了对报告书写的规范性。
本次设计哈希表实现查询系统课程设计,实现了用户通过##或者查找自己建好的old.txt文件和系统自动生成的new.txt文件中的信息。
九﹑附录
源代码
//表示该条记录已使用
intA[10]={1,6,11,16,21,26,31,36,41,46};
//伪随机数
char*DataFile;
//writer.open("
创建new.txt失败!
s[k++]='
s[k++]='
voidBuild_Hash(intHashType)//产生hash表
哈t希¡
ê
表À
ª
过y小?
或¨
°
碰?
撞Á
2过y多¨
!
voidshow(inti)
%s\t%s\t%s\n"
hash_data[i].name,hash_data[i].phone,hash_data[i].address);
intFind(char*str,intselect){
intKey=0;
intReKey;
intm;
if(!
hash_data[Key].used)
return-1;
if((select==1&
strcmp(hash_data[Key].name,str)!
=0)||(select==2&
strcmp(hash_data[Key].phone,str)!
=0))
//if(pInfo[ReHashKey].name==str)
if(strcmp(hash_data[ReKey].name,str)==0)