数据结构课程设计实验报告Word文档格式.docx

上传人:b****6 文档编号:18937263 上传时间:2023-01-02 格式:DOCX 页数:77 大小:401.71KB
下载 相关 举报
数据结构课程设计实验报告Word文档格式.docx_第1页
第1页 / 共77页
数据结构课程设计实验报告Word文档格式.docx_第2页
第2页 / 共77页
数据结构课程设计实验报告Word文档格式.docx_第3页
第3页 / 共77页
数据结构课程设计实验报告Word文档格式.docx_第4页
第4页 / 共77页
数据结构课程设计实验报告Word文档格式.docx_第5页
第5页 / 共77页
点击查看更多>>
下载资源
资源描述

数据结构课程设计实验报告Word文档格式.docx

《数据结构课程设计实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计实验报告Word文档格式.docx(77页珍藏版)》请在冰豆网上搜索。

数据结构课程设计实验报告Word文档格式.docx

(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

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

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1