大数据结构实验报告材料Word文件下载.docx
《大数据结构实验报告材料Word文件下载.docx》由会员分享,可在线阅读,更多相关《大数据结构实验报告材料Word文件下载.docx(43页珍藏版)》请在冰豆网上搜索。
(10)主控函数main()调用以上函数,输出(3)、(5)、(6)、(7)、(8)、(9)处理后的链表内容、输出入住价格最高的客房基本情况。
可能用到的函数:
从文件中读取客房数据:
fscanf(文件指针,"
%s%f,%d"
p->
roomN,&
p->
Price,&
Beds);
输出客房数据:
printf("
%s%8.1f%8.1f%6d%8s\n"
roomN,p->
Price,p->
PriceL,p->
Beds,p->
State);
字符串赋值函数:
char*strcpy(char*,constchar*);
字符串比较函数:
intstrcmp(constchar*,constchar*)
#include<
stdio.h>
stdlib.h>
string.h>
typedefstructHNode//定义客房链表结点结构
{
charroomN[7];
//客房名称
floatPrice;
//标准价格
floatPriceL;
//入住价格(默认值=标准价格*80%)
intBeds;
//床位数Beds
charState[5];
//入住状态(值域:
"
空闲"
、"
入住"
预订"
,默认值为"
structHNode*next;
//指针域
}Hotel,*HLink;
2.2实验二串模式匹配算法(串)
从主串中第K个字符起,求出子串在主串中首次出现的位置,即模式匹配或串匹配。
●要求用三种模式匹配算法分别实现:
⏹朴素的模式匹配算法(BF算法)
⏹KMP改进算法(Next[])
⏹KMP改进算法(NextVal[])
6
首先设计一个含有多个菜单项的主控菜单程序,然后再为这些菜单项配上相应的功能。
程序运行后,给出5个菜单项的内容和输入提示:
1.输入主串、子串和匹配起始位置
2.朴素的模式匹配算法
3.KMP改进算法(Next[])
4.KMP改进算法(NextVal[])
0.退出管理系统
请选择0—4:
●菜单设计要求:
使用数字0—4来选择菜单项,其它输入则不起作用。
●输出结果要求:
输出各趟匹配详细过程(其中3、4,首先输出Next[]或者NextVal[]的各元素的数值),最后输出单个字符比较次数、匹配成功时的位置序号或者匹配失败提示信息。
2.3实验三求二叉树上结点的路径(二叉树)
在采用链式存储结构存储的二叉树上,以bt指向根结点,p指向任一给定的结点,编程实现求出从根结点bt到给定结点p之间的路径。
●设计思路:
数据结构:
typedefstructnode{
chardata;
//数据域
structnode*lchild,*rchild;
//左右孩子指针
}BinTNode;
//树中结点类型
typedefBinTNode*BinTree;
主要实现函数:
⏹二叉树的建立
⏹求指定结点路径
⏹二叉树的前、中、后序遍历算法
⏹查找函数
主控函数及运行环境设置
3.实验步骤
按以上实验内容的要求,给出实验步骤,包括程序流程图、源程序和运行结果截图等。
3.1实验一客房管理(链表)
3.1.1程序流程图
3.1.1源程序
windows.h>
//定义客房链表结点结构
typedefstructHNode
)
//函数声明
voidBuild(HLink&
H);
voidupdateH(HLink&
H,intbeds,charstate[]);
voidExp(HLinkH);
voidAdd(HLink&
voidupBed(HLink&
H,intbeds);
HLinkFirstH(HLink&
voidMoveK1(HLink&
H,intk);
voidReverseN2(HLink&
//主函数
voidmain()
{
HLinkL,h;
intid,k,Beds;
intbeds_num;
charbeds_state[5];
while
(1){
printf("
\n****************欢迎进入客房信息管理系统******************"
);
\n\n请查看相关功能,并【!
!
按顺序!
】输入相关功能编号,谢谢!
\n"
*******************************************************************\n"
|1--查看所有客房信息|\n"
|2--更改客房入住状态|\n"
|3--所有未入住客房加价20%%|\n"
|4--更改床号排列顺序|\n"
|5--查找入住价格最高的客房并清空该信息,然后输出更新后信息|\n"
|6--将倒数第K个客房排在首行|\n"
|7--正中间位置结点之后的全部结点倒置后的客房信息|\n"
||\n"
|!
其他---退出|\n"
*******************************************************************\n\n"
!
请选择:
scanf("
%d"
&
id);
if((id<
1)||(id>
7))
break;
switch(id){
case1:
Build(L);
Exp(L);
break;
case2:
printf("
\n更改客房入住状态:
\n\n"
输入要更改的床位数:
scanf("
beds_num);
\n输入要更改的客房状态(空闲、入住、预订):
%s"
beds_state);
updateH(L,beds_num,beds_state);
输出更新后的客房信息\n"
case3:
\n!
将该链表中未入住的客房入住价格均加价20%%\n"
Add(L);
输出加价后的客房信息\n"
case4:
输入Beds数:
upBed(L,Beds);
case5:
h=FirstH(L);
输出入住客房价格最高的客房信息,并删除该节点\n\n"
-------------------------------------------------\n"
客房名称标准价格入住价格床位数入住状态\n"
%s%8.1f%8.1f%6d%8s\n"
h->
roomN,h->
Price,h->
PriceL,h->
Beds,h->
-------------------------------------------------\n\n"
\n\n输出删除后的客房信息\n"
case6:
输入K值(1<
k<
6):
k);
MoveK1(L,k);
case7:
\n输出正中间位置结点之后的全部结点倒置后的客房信息\n"
ReverseN2(L);
default:
你输入有误!
}
}
}
//正序创建链表:
从键盘输入结点数据
H)
{
HLinkrear;
HLinkp;
char*indata="
.\\studata.txt"
;
//数据输入文件路径及名称
FILE*infile;
//文件指针
infile=fopen(indata,"
r"
//打开文本文件
if(!
infile){
数据输入文件没找到!
exit
(1);
H=(HLink)malloc(sizeof(HNode));
rear=H;
while(!
feof(infile))//判断是否读取到文件结尾
p=(HLink)malloc(sizeof(HNode));
fscanf(infile,"
%s%f%d"
p->
PriceL=(float)0.8*p->
Price;
strcpy(p->
State,"
rear->
next=p;
rear=p;
rear->
next=NULL;
fclose(infile);
//将床位数为beds客房入住状态改为state
H,intbeds,charstate[])
p=H->
next;
while(p)
if(p->
Beds==beds)
strcpy(p->
State,state);
p=p->
//输出所有客房的客房名称、标准价格、入住价格、床位数、入住状态;
voidExp(HLinkH)
p)
数据为空!
return;
printf("
\n*************客房信息输出如下***************\n"
p=p->
//将该链表中未入住的客房入住价格均加价20%
if(!
strcmp(p->
))
p->
PriceL=(float)1.2*p->
PriceL;
//将该链表床位数不超过beds的结点都放在床位数超过beds的结点后面
H,intbeds)
HLinkp=H,q,t;
if(p->
next->
Beds>
beds)
while(p->
next)
{
t=p->
next=p->
q=H->
H->
next=t;
next=q;
}
else
//求出入住价格最高的客房函数,返回入住价格最高的客房结点指针,返回前将该结点在链表中删除;
HLinkp,q,r=H;
q=H->
floatpriceMax=0.0;
if(p->
PriceL>
priceMax)
priceMax=p->
//q=q->
//r=r->
while(q->
PriceL!
=priceMax)
q=q->
r=r->
r->
next=q->
returnq;
//将单链表中倒数第k个结点移到第一个结点位置
H,intk)
HLinkp,q,r,f;
r=H;
f=r->
for(inti=0;
i<
k;
i++)
H->
q->
next=f;
//将单链表的正中间位置结点之后的全部结点倒置的功能
HLinkp=H,q=H,h;
while(q)
p=p->
p=q->
q->
h=p->
q->
p=h;
3.1.1运行结果截图
3.2实验二串模式匹配算法(串)
3.2.1程序流程图
3.2.1源程序
#defineMAXSTRLEN255
typedefunsignedcharSString[MAXSTRLEN+1];
staticinttem,tem1;
//输入字符串
voidgetString(SStringS)
SStrings;
请输入字符串【测试串:
ebababababcaababababcabadaaaacbabababcabad】:
"
scanf("
s);
inti=0;
while(s[i]!
=0){i++;
S[0]=i;
for(intj=0;
j<
i+1;
j++)
S[j+1]=s[j];
//输出字符串
voidOutput(SStringS,SStringT)
S[0]+2;
i++)printf("
----"
\n序号:
for(intnum=1;
num<
=S[0];
num++)
%-4d"
num);
\n主串:
for(intnum1=1;
num1<
num1++)
%-4c"
S[num1]);
\n副串:
for(intnum2=1;
num2<
=T[0];
num2++)
T[num2]);
}
//朴素的模式匹配法
voidIndex(SStringS,SStringT,intpos)
inti=pos,j=1;
while(i<
=S[0]&
&
=T[0])
if(S[i]==T[j])
++i;
++j;
else
i=i-j+2;
j=1;
if(i<
=S[0]-T[0])
【匹配点为:
%d】\n"
i-T[0]);
Index(S,T,i);
else
if(j>
T[0])
%d】"
printf("
0);
//利用模式串T的next函数求T在主串S中第pos字符之后的位置的KMP算法
voidIndex_KMP_next(SStringS,SStringT,intpos,intnext[])
inti=pos,j=1;
\n第%-2d趟:
tem);
for(intnum=0;
i-1;
'
'
while(i<
=S[0]&
j<
if(j==0||S[i]==T[j])
if(j==0)
{
++i;
++j;
else
T[j]);
{
\n\n第%-2d趟:
++tem);
j=next[j];
for(intnum2=0;
i-j;
for(intnum=1;
j;
[%c]"
T[num]);
=S[0]-T[0]){
【此处匹配点为:
tem++;
Index_KMP_next(S,T,i,next);
else{
//利用模式串T的next函数修正值求T在主串S中第pos字符之后的位置的高效KMP算法
voidIndex_K