数据结构电话号码查询系统设计报告及代码Word下载.docx

上传人:b****2 文档编号:705815 上传时间:2023-04-29 格式:DOCX 页数:19 大小:124.88KB
下载 相关 举报
数据结构电话号码查询系统设计报告及代码Word下载.docx_第1页
第1页 / 共19页
数据结构电话号码查询系统设计报告及代码Word下载.docx_第2页
第2页 / 共19页
数据结构电话号码查询系统设计报告及代码Word下载.docx_第3页
第3页 / 共19页
数据结构电话号码查询系统设计报告及代码Word下载.docx_第4页
第4页 / 共19页
数据结构电话号码查询系统设计报告及代码Word下载.docx_第5页
第5页 / 共19页
数据结构电话号码查询系统设计报告及代码Word下载.docx_第6页
第6页 / 共19页
数据结构电话号码查询系统设计报告及代码Word下载.docx_第7页
第7页 / 共19页
数据结构电话号码查询系统设计报告及代码Word下载.docx_第8页
第8页 / 共19页
数据结构电话号码查询系统设计报告及代码Word下载.docx_第9页
第9页 / 共19页
数据结构电话号码查询系统设计报告及代码Word下载.docx_第10页
第10页 / 共19页
数据结构电话号码查询系统设计报告及代码Word下载.docx_第11页
第11页 / 共19页
数据结构电话号码查询系统设计报告及代码Word下载.docx_第12页
第12页 / 共19页
数据结构电话号码查询系统设计报告及代码Word下载.docx_第13页
第13页 / 共19页
数据结构电话号码查询系统设计报告及代码Word下载.docx_第14页
第14页 / 共19页
数据结构电话号码查询系统设计报告及代码Word下载.docx_第15页
第15页 / 共19页
数据结构电话号码查询系统设计报告及代码Word下载.docx_第16页
第16页 / 共19页
数据结构电话号码查询系统设计报告及代码Word下载.docx_第17页
第17页 / 共19页
数据结构电话号码查询系统设计报告及代码Word下载.docx_第18页
第18页 / 共19页
数据结构电话号码查询系统设计报告及代码Word下载.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

数据结构电话号码查询系统设计报告及代码Word下载.docx

《数据结构电话号码查询系统设计报告及代码Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构电话号码查询系统设计报告及代码Word下载.docx(19页珍藏版)》请在冰点文库上搜索。

数据结构电话号码查询系统设计报告及代码Word下载.docx

系别:

计算机科学与通信工程学院

专业:

计算机科学与技术

班级:

10-01

学号:

**********41

指导教师:

卢冰、李晔

2012年6月21日

设计题目

题目:

每个记录有下列数据项:

电话号码、用户名、地址;

运行环境(软、硬件环境)

Vc6.0

算法设计的思想

电话号码查询系统主要是考察我们对哈希查找的掌握。

题目要求用电话号码和姓名两种方式查找;

第一大部份是用电话号码查找,第二部分是用姓名查找。

1:

电话号码查找(先建立哈希表读入数据,然后再处理冲突,查找):

在这部分中,我用了除留取余法和数字分析法设计的哈希表,用的是开放定址法进行的冲突处理。

除留取余法思想:

取关键字被某个不大于哈希表表长的数p除后所得余数为哈希地址即:

H(key)=key%p。

数字分析法:

已知关键字是以r为基础的数,哈希表中出现的关键字是事先知道的,选择关键字是候,我们应该尽量避免冲突。

开放地址法:

开放地址法主要公式;

H=(H+di)%m,di的取法有三种,但是我的程序中只用到了线性探测在散列,本可以用再哈希函数解决冲突的,但是考虑到再哈希函数会增加计算时间,所以就没用。

2:

姓名查找(先建立哈希表读入数据,然后再处理冲突,查找)方式:

这个过程中,我选取了数字分析法,解释如上。

主菜单的设计在设计效果上已经显示,不过多说明。

算法的流程

主菜单建立->除留取余和数字分析法存储->开放地址法解决冲突->查找。

算法设计分析

这段代码是哈希存储时从第三个数开始求,提高了代码效率。

inti=3;

while(s.num[i]!

='

\0'

)//关键字

{

key+=(s.num[i]-'

0'

);

//关键字求和

i++;

}

key=key%21;

线性探测再散列处理冲突

if(!

strcmp(W.t[key].num,"

"

))//查找,解决冲突

W.t[key]=s;

else

{//第一次没解决彻底,继续解决冲突

intj=1;

while(strcmp(W.t[(key+j)%21].num,"

))j++;

W.t[(key+j)%21]=s;

}

}

查找代码;

while(xnum[i]!

{

key+=(xnum[i]-'

//求和

i++;

}

key=key%21;

if(!

strcmp(W.t[key].num,xnum))//第一次查找,如果值相等直接赋值

printf("

%s%s%s\n"

W.t[key].name,W.t[key].address,W.t[key].num);

else

{//第一次没找到,继续查找

intj=1;

while(strcmp(W.t[(key+j)%21].num,xnum))j++;

if(j==20)

printf("

查找元素不存在!

W.t[(key+j)%21].name,W.t[(key+j)%21].address,W.t[(key+j)%21].num);

//输出查找到得元素

主界面:

printf("

********电话号码查询系统********\n"

用电话号码查询1\n"

用用户名查询2\n"

********************************\n"

请输入您要的选项:

\n"

intx,y;

while(scanf("

%d"

&

x)!

=-1)

{

if(x==1)

********电话号码查询********\n"

除留取余法1\n"

数字分析法2\n"

****************************\n"

请输入y值:

scanf("

y);

while(y<

3)

{

switch(y)

{

case1:

chuliu();

break;

//调用除留取余函数

case2:

shuzi();

//调用数字分析函数

default:

printf("

输入指令不存在!

}

elseif(x==2)

********用户名查询********\n"

分析法3\n"

fenxi();

//调用分析函数

查找方式不存在!

请重新输入\n"

运行结果分析

测试实例:

wangpingkaifeng123456

wangdoudouluoyang456789

zhaijiajaizhengzhou147258

sunxuepingzhoukou258369

收获及体会

本次试验电话号码查询系统,看起来也不是想我想象中的那么难,他比较具有针对性,要求我们用哈希函数解决这倒比较实用的题目,但是这道题目用到的哈希函数仅仅是哈希中的九牛一毛,虽然写了大程序,但是对哈希表的了解还是一无所知,数据结构这门课程我认为有点难,也许是我c语言基础不够强吧,好多代码都不是很理解,以至于不能够灵活运用,其实通过每次实验我们都可以发现,数据结构的知识好像就是草原的草,密密麻麻的等待我们去拔掉,这是一项浩大的工程等待我们去建设,与此同时,也要求我们要踏实的完成每一次作业,认真的去分析重要的代码,只有端正自己的态度,才能不断地学到新的知识,提高自己。

程序设计代码:

#include<

string.h>

#include<

stdlib.h>

stdio.h>

#defineNULL0

int*p;

structnode//建节点

{

charname[20],address[50];

charnum[11];

node*next;

};

structNode//建节点

typedefnode*Lnode;

typedefNodeTnode;

typedefstructlode

{

Lnodenext;

}lode;

typedefstruct{//顺序表存储下的哈希表

intsize;

Tnodet[10000];

}Qnode;

typedefstruct{//链表存储下的哈希表

lodeL[10000];

}Pnode;

voidchuliu()//除留取余法查询电话号码

QnodeW;

memset(W.t,0,sizeof(W.t));

//初始化

Tnodes;

输入录入数据个数:

intn;

scanf("

n);

W.size=n;

//录入元素

请输入你要录入的元素:

while(n--)

姓名地址电话号码\n"

%s%s%s"

s.name,s.address,s.num);

inti=3,key;

//线性探测再散列处理冲突

请输入您要查找的电话号码:

//查找

charxnum[11];

%s"

xnum);

inti=3;

intkey=xnum[2]-'

;

while(xnum[i]!

}

voidshuzi()//按电话号码-数字分析法

Qnodeq1;

请输入您要输入的数据个数:

intn,m1,m2;

memset(q1.t,0,sizeof(q1.t));

q1.size=n;

for(inti=0;

i<

10000;

i++)

strcpy(q1.t[i].num,"

//置空

m1=m2=0;

请输入您要录入的元素:

//读入数据

__int64key;

key=((__int64)s.num)%10000;

//处理冲突(方法同上)

strcmp(q1.t[key].num,"

))

q1.t[key]=s;

i=1;

m1++;

while(strcmp(q1.t[(key+i)%10000].num,"

))i++;

q1.t[(key+i)%10000]=s;

intk=3;

__int64key=(__int64)xnum;

key=key%10000;

strcmp(q1.t[key].num,xnum))

q1.t[key].name,q1.t[key].address,q1.t[key].num);

while(strcmp(q1.t[(key+j)%10000].num,xnum))j++;

q1.t[(key+j)%10000].name,q1.t[(key+j)%10000].address,q1.t[(key+j)%10000].num);

voidfenxi()

Qnodeq2;

memset(q2.t,0,sizeof(q2.t));

q2.size=n;

strcpy(q2.t[i].name,"

key=((__int64)s.name)%10000;

//处理冲突

strcmp(q2.t[key].name,"

q2.t[key]=s;

while(strcmp(q2.t[(key+i)%10000].name,"

q2.t[(key+i)%10000]=s;

请输入您要查找的名字:

charxname[20];

xname);

intk=1;

__int64key=(__int64)xname;

strcmp(q2.t[key].name,xname))

q2.t[key].name,q2.t[key].address,q2.t[key].num);

while(strcmp(q2.t[(key+j)%10000].name,xname))j++;

q2.t[(key+j)%10000].name,q2.t[(key+j)%10000].address,q2.t[(key+j)%10000].num);

voidmenu()

intmain()//函数

menu();

return0;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2