数据结构校园导游实验报告Word文档下载推荐.docx
- 文档编号:22391785
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:38
- 大小:130.91KB
数据结构校园导游实验报告Word文档下载推荐.docx
《数据结构校园导游实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构校园导游实验报告Word文档下载推荐.docx(38页珍藏版)》请在冰豆网上搜索。
,*yous="
┓"
*youx="
┛"
;
structadjinfo//路信息
{
intlen;
//道路长度8
intcategory;
//道路类别1:
车道2:
人行道3:
观景路径
intdir;
//方向1表示i在j的西边,2表示i在j的北边,3表示i在j的西北边,4表示i在j的西南边.负数则表示相反。
};
structadj//边结构体
intmark;
intivex;
intjvex;
adj*ilink,*jlink;
adjinfoinfo;
typedefstruct//地点结构体
charname[50];
charintro[50];
adj*firstedge;
}site;
typedefstruct
sitespot[50];
intspotnum,adjnum;
}graph;
voidinit(graph&
t)//初始化图
t.adjnum=0;
t.spotnum=0;
}
voidaddsite(char*Name,char*Intro,graph&
t)//添加地点
strcpy(t.spot[t.spotnum].intro,Intro);
strcpy(t.spot[t.spotnum].name,Name);
t.spot[t.spotnum].firstedge=NULL;
t.spotnum++;
voidaddadj(inti,intj,intlength,intcate,intdi,graph&
t)//添加道路
adj*p1,*p2;
p1=(adj*)malloc(sizeof(adj));
p1->
ilink=NULL;
p1->
jlink=NULL;
ivex=i;
jvex=j;
mark=0;
info.category=cate;
info.dir=di;
info.len=length;
p2=t.spot[i].firstedge;
if(p2==NULL)
t.spot[i].firstedge=p1;
else
{
mark=0;
while(mark==0)
{
if(p2->
ivex==i&
&
p2->
ilink==NULL)mark=1;
elseif(p2->
jvex==i&
jlink==NULL)mark=2;
ivex==i)p2=p2->
ilink;
jvex==i)p2=p2->
jlink;
}
if(mark==1)
p2->
ilink=p1;
else
jlink=p1;
}
p2=t.spot[j].firstedge;
t.spot[j].firstedge=p1;
ivex==j&
jvex==j&
ivex==j)p2=p2->
jvex==j)p2=p2->
voidDeladj(inti,intj,graph&
t)//删除道路
p1=t.spot[i].firstedge;
p2=p1;
mark=0;
while(mark==0)
if(p1->
ivex==i)mark=1;
elseif(p1->
jvex==i)mark=2;
ivex==i)mark=3;
jvex==i)mark=4;
ivex==i){p2=p1;
p1=p1->
jvex==i){p2=p1;
elsemark=5;
if(mark==1)
if(p1==t.spot[i].firstedge)
{t.spot[i].firstedge=p1->
free(p1);
ilink=p1->
free(p1);
elseif(mark==2)
p2->
jlink=p1->
free(p1);
elseif(mark==3)
elseif(mark==4)
elseif(mark==5)
printf("
找不到该道路\n"
);
p1=t.spot[j].firstedge;
ivex==j)mark=1;
jvex==j)mark=2;
ivex==j)mark=3;
jvex==j)mark=4;
ivex==j){p2=p1;
jvex==j){p2=p1;
if(p1==t.spot[j].firstedge)
{t.spot[j].firstedge=p1->
voidDelsite(intn,graph&
t)//删除地点
inti;
while(t.spot[n].firstedge)
Deladj(t.spot[n].firstedge->
ivex,t.spot[n].firstedge->
jvex,t);
if(n+1<
t.spotnum)
for(i=n+1;
i<
t.spotnum;
i++)
t.spot[i-1]=t.spot[i];
t.spotnum--;
voidprintfsite(graph&
t)//打印景点清单
printf("
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n"
┃**┃景点名称┃简介┃\n"
for(i=0;
┃%-2d┃%-20s┃%-38s┃\n"
i,t.spot[i].name,t.spot[i].intro);
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n"
voidgetlmat(graph&
t,intcat,intlm[50][50][2])//得到景点路径的矩阵lm[i][j][0]存放路径长度lm[i][j][1]存放方向信息
adj*p;
inti,j;
for(j=0;
j<
j++)
{lm[i][j][1]=0;
if(i==j)lm[i][j][0]=0;
elselm[i][j][0]=999;
p=t.spot[i].firstedge;
while(p)
if(p->
info.category==cat||cat==0)
{
lm[p->
ivex][p->
jvex][0]=p->
info.len;
jvex][1]=p->
info.dir;
jvex][p->
ivex][0]=p->
ivex][1]=-p->
}
ivex==i)p=p->
elsep=p->
}
voidgetshortlmat(intmat[50][50][2],graph&
t,intpb[50][50][50])//由FLOYD算法得到最短路径矩阵并用pb数组记录中转节点pb[i][j][]表示i->
j依次通过的节点。
inti,j,k,m,te,g=0,time,m1;
for(k=0;
k<
k++)
pb[i][j][k]=-1;
for(time=0;
time<
time++)
if(mat[i][k][0]+mat[k][j][0]<
mat[i][j][0])
{
mat[i][j][0]=mat[i][k][0]+mat[k][j][0];
te=k;
g=1;
}
if(g==1)
m=0;
while(pb[i][te][m]!
=-1)
{
pb[i][j][m]=pb[i][te][m];
m++;
}
pb[i][j][m]=te;
m++;
m1=0;
while(pb[te][j][m1]!
pb[i][j][m+m1]=pb[te][j][m1];
m1++;
pb[i][j][m+m1]=-1;
g=0;
voidprintdir(intn)//根据DIR数值输出方向
switch(n)
case-1:
printf("
东"
break;
case-2:
南"
case-3:
东南"
case-4:
东北"
case1:
西"
case2:
北"
case3:
西北"
case4:
西南"
default:
error"
voidGPS1(graph&
t,intcat,intstart,intdes)//寻找最短路径
inti,j,m,g;
intlmat[50][50][2],pb[50][50][50];
getlmat(t,cat,lmat);
getshortlmat(lmat,t,pb);
i=start;
j=des;
g=i;
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"
%s到%s\n"
t.spot[i].name,t.spot[j].name);
从%s"
t.spot[i].name);
for(m=0;
pb[i][j][m]>
=0;
m++)
向"
printdir(lmat[pb[i][j][m]][g][1]);
%d米至%s"
lmat[g][pb[i][j][m]][0],t.spot[pb[i][j][m]].name);
g=pb[i][j][m];
printdir(lmat[j][g][1]);
lmat[g][j][0],t.spot[j].name);
\n道路类别:
"
if(cat==1)printf("
车道\t"
elseif(cat==2)printf("
人行道\t"
elseif(cat==3)printf("
观景路径\t"
总路程:
%d(m)\n"
lmat[i][j][0]);
voidgetxy(intx,inty,intdir,intdis,intbi,int&
x1,int&
y1)//通过坐标(x,y)得到与它方向为DIR距离为DIS和比例尺为BI的点坐标(x1,y1)
switch(dir)
y1=y;
x1=x+dis/bi;
x1=x;
y1=y+dis/bi;
x1=x+(dis/bi)*7/10;
y1=y+(dis/bi)*7/10;
y1=y-(dis/bi)*7/10;
x1=x-dis/bi;
y1=y-dis/bi;
x1=x-(dis/bi)*7/10;
intmax2(intx,inty)
return((x>
y)?
x:
y);
intmin2(intx,inty)
return((x<
voidlinking(charg[100][100],intX,intY,intX1,intY1)//将(X,Y)和(X1,Y1)用'
*'
链接
intx,y,x1,y1;
if(X<
X1){x=X;
x1=X1;
y=Y;
y1=Y1;
else{x=X1;
x1=X;
y=Y1;
y1=Y;
intk,i;
if(x==x1)
for(i=min2(y,y1);
max2(y,y1);
g[i][x]='
.'
k=10*(y1-y)/(x1-x);
for(i=0;
x1-x;
g[y+i*k/10][x+i]='
voidpt(charg[100][100],intx,inty,char*name)//在(x,y)点做一个带边框文字为name的tip
inti,len=strlen(name);
if(len%2)len++;
g[y][x-2]=shu[0];
g[y][x-1]=shu[1];
g[y+1][x-2]=zuox[0];
g[y+1][x-1]=zuox[1];
g[y-1][x-2]=zuos[0];
g[y-1][x-1]=zuos[1];
len;
g[y-1][i+x]=heng[i%2];
g[y+1][i+x]=heng[i%2];
g[y][i+x]=name[i];
i=i+x-1;
g[y][i+1]=shu[0];
g[y][i+2]=shu[1];
g[y+1][i+1]=youx[0];
g[y+1][i+2]=youx[1];
g[y-1][i+1]=yous[0];
g[y-1][i+2]=yous[1];
voidprintgraph(charg[100][100],intwei,inthei)//打印高hei宽wei的字符数组g
hei;
wei;
{printf("
%c"
g[i][j]);
\n"
voidDFSTip(charg[100][100],graph&
t,intn,intxy[50][3],intbi)//深度遍历第n个节点,通过与它相连的边得到与他相连的节点坐标存入xy数组里,并在字符数组g中连接每个存在的路径比例尺为bi
intmark=0;
adj*tj=t.spot[n].firstedge;
while
(1)
if(tj->
ivex==n)
if(!
xy[tj->
jvex][0])
getxy(xy[n][1],xy[n][2],tj->
info.dir,tj->
info.len,bi,xy[tj->
jvex][1],xy[tj->
jvex][2]);
xy[tj->
jvex][0]=1;
DFSTip(g,t,tj->
jvex,xy,bi);
if(xy[tj->
jvex][0]&
xy[n][1]>
=0&
xy[n][1]<
100&
xy[n][2]>
xy[n][2]<
=100&
jvex][1]>
jvex][1]<
jvex][2]>
jvex][2]<
=100)
linking(g,xy[n][1],xy[n][2],xy[tj->
(tj=tj->
ilink))break;
elseif(tj->
jvex==n)
ivex][0])
getxy(xy[n][1],xy[n][2],-tj->
ivex][1],xy[tj->
ivex][2]);
ivex][0]=1;
ivex,xy,bi);
ivex][0]&
ivex][1]>
ivex][1]<
ivex][2]>
ivex][2]<
=100)
jlink))break;
voidgetmap(charg[100][100],grapht,intbi,intxuhao)//由图t得
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 校园 导游 实验 报告