数据结构课程设计实验报告Word文档格式.docx
- 文档编号:18937263
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:77
- 大小:401.71KB
数据结构课程设计实验报告Word文档格式.docx
《数据结构课程设计实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计实验报告Word文档格式.docx(77页珍藏版)》请在冰豆网上搜索。
(1)系统功能的完善;
(2)设计不同的散列函数,比较冲突率;
(3)在散列函数确定的前提下,尝试各种不同类型处理冲突的方法,考察平均查找长度的变化。
(二)算法设计说明
此算法要用散列表实现,里面必须涉及到哈希表的建立,整个程序要实现的功能有:
添加用户信息;
读取所有用户信息;
以姓名建立哈希表;
以电话号码建立哈希表;
查找并显示给定用户名的记录;
查找并显示给定电话号码的记录;
清屏以及保存功能。
定义电话本记录数量(MAXSIZE)、表长(HASHSIZE)、姓名长度(MAX_SIZE)以及结构体typedefstruct的内容,构造两个哈希函数hash1和hash2。
解决冲突的办法,姓名用折叠法处理,电话号码取其整型长度,hash1是用姓名建立的哈希函数,hash2是用电话号码建立的哈希函数,两个哈希函数都是用除留余数法实现。
处理冲突的函数,采用二次探测法。
(三)测试结果
1.程序的主界面,包含程序的各个功能:
2.添加用户信息的测试结果:
3.用哈希数查找第一个用户的信息:
(四)分析与探讨
这道题主要解决在查找用户时解决冲突。
利用哈希表。
程序的功能像添加用户信息,读取所有用户信息,清屏以及保存功能,都很容易实现,而像以姓名建立哈希表;
查找并显示给定电话号码的记录这些就比较难点。
要想实现这些,必须了解关于散列表的一些基本定义和原理。
以姓名建立哈希表的主要函数:
voidCreateHash1(HashTable*H,Record*a){
for(i=0;
i<
NUM_BER;
i++)
{
c=0;
p=Hash1(a[i].name);
pp=p;
while(H->
elem[pp]!
=NULL)
{
pp=collision(p,c);
if(pp<
0){
cout<
<
"
第"
i+1<
记录无法解决冲突"
;
continue;
}
}
H->
elem[pp]=&
(a[i]);
count++;
cout<
个记录冲突次数为"
c<
.\n"
}
cout<
\n建表完成!
\n此哈希表容量为"
HASHSIZE<
当前表内存储的记录个数为"
H->
count<
benGetTime();
}
其中的难点就是管理冲突的解决办法,方法就是用二次探测法,主要实现:
voidSearchHash1(HashTable*H,int&
c){
NAstr;
\n请输入要查找记录的姓名:
\n"
cin>
>
str;
intp,pp;
p=Hash1(str);
pp=p;
while((H->
=NULL)&
&
(eq(str,H->
elem[pp]->
name)==-1))
pp=collision(p,c);
if(H->
=NULL&
eq(str,H->
name)==1){
\n查找成功!
\n查找过程冲突次数为"
c"
姓名:
name<
\n电话号码:
tel<
\n联系地址:
add<
elsecout<
\n此人存在,查找不成功!
(五)流程图
(六)附录:
源代码
#include<
stdio.h>
iostream.h>
string>
#include<
windows.h>
#defineMAXSIZE20//电话薄记录数量
#defineMAX_SIZE20//人名的最大长度
#defineHASHSIZE53//定义表长
#defineSUCCESS1
#defineUNSUCCESS-1
#defineLENsizeof(HashTable)
typedefintStatus;
//自定义类型语句
typedefcharNA[MAX_SIZE];
typedefstruct{//记录
NAname;
NAtel;
NAadd;
}Record;
typedefstruct{//哈希表
Record*elem[HASHSIZE];
//数据元素存储基址
intcount;
//当前数据元素个数
intsize;
//当前容量
}HashTable;
//关键字比较功能的实现
Statuseq(NAx,NAy){//关键字比较,相等返回SUCCESS;
否则返回UNSUCCESS
if(strcmp(x,y)==0)
returnSUCCESS;
elsereturnUNSUCCESS;
//记录个数功能的实现
StatusNUM_BER;
//记录定义的个数
//输入信息功能
voidgetin(Record*a){//键盘输入各人的信息
输入要添加的个数:
for(inti=0;
{
请输入第"
个记录的用户名:
cin>
a[i].name;
个记录的电话号码:
a[i].tel;
个记录的地址:
a[i].add;
//显示输入信息的实现
voidShowInformation(Record*a)//显示输入的用户信息
{
i++)
\n第"
个用户信息:
\n姓名:
a[i].name<
\n电话号码:
<
a[i].tel<
\n联系地址:
a[i].add<
}
//清屏功能的实现
voidCls(Record*a){
system("
cls"
);
longfold(NAs){//人名的折叠处理
char*p;
longsum=0;
NAss;
strcpy(ss,s);
//复制字符串,不改变原字符串的大小写
strupr(ss);
//将字符串ss转换为大写形式
p=ss;
while(*p!
='
\0'
)
sum+=*p++;
\nsum===================="
sum;
returnsum;
//构造哈希函数
intHash1(NAstr){//哈希函数
longn;
intm;
n=fold(str);
//先将用户名进行折叠处理
m=n%HASHSIZE;
//折叠处理后的数,用除留余数法构造哈希函数
returnm;
//并返回模值
intHash2(NAstr){//哈希函数
n=atoi(str);
//把字符串转换成整型数.
//用除留余数法构造哈希函数
//冲突处理函数,用于解决冲突
Statuscollision(intp,int&
c){//冲突处理函数,采用二次探测法
inti,q;
i=c/2+1;
while(i<
HASHSIZE){
if(c%2==0){
c++;
q=(p+i*i)%HASHSIZE;
if(q>
=0)returnq;
elsei=c/2+1;
else{
q=(p-i*i)%HASHSIZE;
returnUNSUCCESS;
voidbenGetTime();
voidCreateHash1(HashTable*H,Record*a){//建表,以人的姓名为关键字,建立相应的散列表benGetTime();
inti,p=-1,c,pp;
//需要显示冲突次数时输出
}//无法解决冲突,跳入下一循环
//求得哈希地址,将信息存入
//查找功能的实现
c){//在通讯录里查找姓名关键字,若查找成功,显示信息
.以下是您需要要查找的信息:
\n\n"
\n此人不存在,查找不成功!
voidbenGetTime(){
SYSTEMTIMEsys;
GetLocalTime(&
sys);
sys.wYear<
sys.wMonth<
sys.wDay<
sys.wHour<
sys.wMinute<
sys.wSecond<
sys.wMilliseconds;
voidCreateHash2(HashTable*H,Record*a){//建表,以电话号码为关键字,建立相应的散列表
i++){
p=Hash2(a[i].tel);
=NULL){
。
voidSearchHash2(HashTable*H,int&
c){//在通讯录里查找电话号码关键字,若查找成功,显示信息
NAtele;
\n请输入要查找记录的电话号码:
tele;
p=Hash2(tele);
=NULL)&
(eq(tele,H->
tel)==-1))
eq(tele,H->
tel)==1){
//主界面功能的实现:
intmain(intargc,char*argv[]){
intc,flag=1;
HashTable*H;
H=(HashTable*)malloc(LEN);
HASHSIZE;
elem[i]=NULL;
H->
size=HASHSIZE;
count=0;
Recorda[MAXSIZE];
while
(1){
\n欢迎使用电话号码查找系统"
\n
\n┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓"
\n┃**哈希表的设计与实现**┃"
\n┃#############################################################┃"
\n┃1.添加用户信息┃"
\n┃2.读取所有用户信息┃"
\n┃3.以姓名建立哈希表(解决冲突)┃"
\n┃4.以电话号码建立哈希表(解决冲突)┃"
\n┃5.查找并显示给定用户名的所有信息┃"
\n┃6.查找并显示给定电话号码的所有信息┃"
\n┃7.清屏处理┃"
\n┃8.退出程序┃"
\n┃^_^温馨提示:
┃"
\n┃@进行5操作前请先运行3┃"
\n┃@进行6操作前请先运行4(否则查找失败!
)┃"
\n┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛"
请输入操作序号:
intnum;
num;
switch(num){
case1:
getin(a);
break;
case2:
ShowInformation(a);
case3:
CreateHash1(H,a);
//以姓名建立哈希表
case4:
CreateHash2(H,a);
//以电话号码建立哈希表
case5:
c=0;
SearchHash1(H,c);
case6:
SearchHash2(H,c);
case7:
Cls(a);
case8:
return0;
default:
cout<
你输错了,请重新输入!
pause"
return0;
第二题
文章编辑
功能:
输入一页文字,程序可以统计出文字、数字、空格的个数。
静态存储一页文章,每行最多不超过80个字符,共N行;
要求:
(1)分别统计出其中英文字母数和空格数及整篇文章总字数;
(2)统计某一字符串在文章中出现的次数,并输出该次数;
(3)删除某一子串,并将后面的字符前移。
存储结构使用线性表,分别用几个子函数实现相应的功能;
输入数据的形式和范围:
可以输入大写、小写的英文字母、任何数字及标点符号。
输出形式:
(1)分行输出用户输入的各行字符;
(2)分4行输出"
全部字母数"
、"
数字个数"
空格个数"
文章总字数"
(3)输出删除某一字符串后的文章;
一.概要设计
1.定义结构体structline,文本行采用顺序存储,行与行之间采用链式存储。
二.流程图
三.测试结果
四.源代码
string.h>
typedefstructline
char*data;
structline*next;
}LINE;
//创建列表,向里面输入文本数据
//向屏幕输出文字
voidOutPut(LINE*&
head)
LINE*p=head;
//头指针
printf("
输入的文章为:
do//执行
printf("
%s\n"
p->
data);
}
while((p=p->
next)!
=NULL);
//遍历列表
voidmenu()//主菜单函数
*********************文章编辑**********************\n"
***************************************************\n"
1.统计文章中全部英文字母数\n"
2.统计文章中空格数\n"
3.统计文章中数字个数\n"
4.统计文章总字数\n"
5.统计指定字符串在文章中出现的次数\n"
6.删除指定字符串\n"
voidCreate(LINE*&
printf("
请输入一篇文章,以ctrl+E(^E)结尾(每行最多输入80个字符):
LINE*p=newLINE;
//为链表建立一个附加表头指针
head=p;
//附给表头指针
chartmp[100];
while
(1)
gets(tmp);
//输入字符串
if(strlen(tmp)>
80)
{
printf("
每行最多输入80个字符"
}
if
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)