校园导游程序实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西安郵電學院
数据结构
课内实验报告书
院系名称:计算机学院
实验题目:校园导游程序
学生姓名:
专业名称:计算机科学与技术班级:
学号:
时间: 2011年11月28日指导教师:曾艳
一、实验题目:校园导游程序
二、实验目的:
通过本次实验,熟练掌握图的存储结构定义及其算法的实现,学会利用图结构来解决具体问题。
三、实验要求:
用无向网表示你所在的学校的校园景点平面图,图中顶点表示主要景点,存放景点的编号、名称、简介等信息,图中的边表示景点间的道路,存放路径长度等信息。
要求实现以下功能:
(1)查询各的相关信息;
(2)查询图中任意两个景点间的最短路径;
四、设计与实现过程
(1)存储结构定义
typedef struct Vertex
{
char vertexname1;
char vertexname2[20];
char info[100];
int change;
}VertexData;/*景点信息的定义*/
typedef struct ArcNode
{
int adj;/*权值*/
}ArcNode;
typedef struct
{
VertexData vertex[MAX_VERTEX_NUM];
ArcNode arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vexnum,arcnum;
int
Shortchange1[MAX_VERTEX_NUM][MAX_VERTEX_NUM][MAX_VERTEX_N UM];/*找到中转最少的路径*/
int
Shortchange2[MAX_VERTEX_NUM][MAX_VERTEX_NUM][MAX_VERTEX_N UM];/*找到距离最短的路径*/
int dist1[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int dist2[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
GraphKind kind;
}AdjMatrix
(2)主要算法描述
int UserHandle1(AdjMatrix *G)/*景点介绍输出的函数*/
{
char s[3],n;
int ch;
getchar();
scanf("%s",s);
if(strlen(s)>1)
ch=(s[0]-'0')*10+(s[1]-'0');
else
{
n=s[0];
if(n>=48&&n<=57)
ch=n-'0';
else if(n>=65&&n<=90)
ch=n-'A'+1;
else
ch=n-'a'+1;
}
if(ch>0&&ch<=G->vexnum)
{
printf("\n\t%c.%s %s",G->vertex[ch-1].vertexname1,G->vertex[ch-1].vertexnam e2,G->vertex[ch-1].info);
return 1;
}
else
printf("\n\t输入有误,按回车键继续");
getch();
return 0;
}
void CreateShortChange(AdjMatrix *G)/*两个景点间的中转最少,距离最短的建立*/
{
int i,j,k,n,m,p;
for(i=0;i
for(j=0;j
{
G->dist1[i][j]=0;
for(k=0;k
G->Shortchange1[i][j][k]=G->Shortchange2[i][j][k]=0;
if(G->arcs[i][j].adj<0)
G->dist2[i][j]=-1;
else if(G->arcs[i][j].adj==0)
G->dist2[i][j]=0;
else
{
G->Shortchange1[i][j][0]=G->Shortchange2[i][j][0]=i+1;
G->Shortchange1[i][j][1]=G->Shortchange2[i][j][1]=j+1;
G->dist1[i][j]=G->arcs[i][j].adj;
G->dist2[i][j]=G->arcs[i][j].adj;
}
}
for(i=0;i
{
for(j=0;j
{
if(G->Shortchange1[i][j][0]>0)
for(k=0;k
{
if(G->Shortchange1[j][k][0]>0&&G->Shortchange1[i][k][0]==0&&i!=k)
{
for(n=0;G->Shortchange1[j][k][n]>0;n++);p=n;
for(;n>0;n--)
G->Shortchange1[i][k][n]=G->Shortchange1[j][k][n-1];
G->Shortchange1[i][k][0]=i+1;
for(m=0;m<=p;m++)
G->Shortchange1[k][i][m]=G->Shortchange1[i][k][p-m];
G->dist1[i][k]=G->dist1[i][j]+G->dist1[j][k];G->dist1[k][i]=G->dist1[i][k];
}
}
if(G->Shortchange2[i][j][0]>0)
for(k=0;k
{
if(G->Shortchange2[j][k][0]>0)
{
if(G->dist2[i][k]<0||((G->dist2[i][k]>G->dist2[i][j]+G->dist2[j][k])&&i!=k&&G->dist2[i][k]>0))
{
for(n=0;G->Shortchange2[j][k][n]>0;n++);p=n;
for(m=0;G->Shortchange2[i][k][m]>0;m++);
for(;m>n;m--)
{
G->Shortchange2[i][k][m-1]=0;
G->Shortchange2[k][i][m-1]=0;
}
for(;n>0;n--)
G->Shortchange2[i][k][n]=G->Shortchange2[j][k][n-1];
G->Shortchange2[i][k][0]=i+1;
for(m=0;m<=p;m++)
G->Shortchange2[k][i][m]=G->Shortchange2[i][k][p-m];
G->dist2[i][k]=G->dist2[i][j]+G->dist2[j][k];G->dist2[k][i]=G->dist2[i][k];