代码
head.h
#ifndef HEAD_H_INCLUDED
#define HEAD_H_INCLUDED
# pragma once
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#include<string.h>
#define INFINITY 10000 /*图的矩阵中A(i,i)记为0,若没有通路,记为infinity = 10000。*/
#define MAX_VERTEX_NUM 40 //最大定点数定为40
#define MAX 40
typedef struct ArCell
{
int adj; //路径长度
}ArCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct //图中顶点表示主要景点,存放景点的编号、名称、简介等信息,
{
char name[30];
int num;
char introduction[100];//简介
}infotype;
typedef struct
{
infotype vexs[MAX_VERTEX_NUM];
AdjMatrix arcs;
int vexnum,arcnum;
}MGraph;
void cmd(void);
MGraph InitGraph(void);//对图初始化
void Menu(void);//创建菜单选项
void Browser(MGraph *G);//浏览图的信息
void ShortestPath_DIJ(MGraph * G);//用Dijkstra计算两个景点的最短路径
void Floyd(MGraph *G);//用佛洛依德算法计算从任意景点出发到其他所有顶点的最短路径
void Search(MGraph *G);//查看某个景点的信息
int LocateVex(MGraph *G,char* v);//
MGraph * CreatUDN(MGraph *G);//手动创建一个校园图,为相应的边赋值
void print(MGraph *G);//两景点之间不存在路径,输出INFINITY
#endif // HEAD_H_INCLUDED
head.cpp
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include "head.h"
void cmd(void)
{
MGraph b;
int i;
b=InitGraph();
Menu();
scanf("%d",&i);
while(i!=5)
{
switch(i)
{
case 1:system("cls");Browser(&b);Menu();break;
case 2:system("cls");ShortestPath_DIJ(&b);Menu();break;
case 3:system("cls");Floyd(&b);Menu();break;
case 4:system("cls");Search(&b);Menu();break;
case 5:exit(1);break;
default:break;
}
scanf("%d",&i);
}
}
MGraph InitGraph(void)
{
MGraph G;
int i,j;
G.vexnum=10;
G.arcnum=14;
for(i=0;i<G.vexnum;i++)
G.vexs[i].num=i;
strcpy(G.vexs[0].name,"第一餐厅");
strcpy(G.vexs[0].introduction,"传统标准化食堂,价格实惠");
strcpy(G.vexs[1].name,"八景园");
strcpy(G.vexs[1].introduction,"鸟语花香,绿树成荫,适宜休息和读书");
strcpy(G.vexs[2].name,"学生宿舍楼");
strcpy(G.vexs[2].introduction,"烟台大学最早一批宿舍楼,历史悠久");
strcpy(G.vexs[3].name,"青春广场");
strcpy(G.vexs[3].introduction,"举办户外的大型歌舞晚会");
strcpy(G.vexs[4].name,"钟楼");
strcpy(G.vexs[4].introduction,"烟大标志性建筑,计算机学院领导办公楼");
strcpy(G.vexs[5].name,"体育场");
strcpy(G.vexs[5].introduction,"现代化塑胶跑道,适宜锻炼身体的场所");
strcpy(G.vexs[6].name,"湖心岛");
strcpy(G.vexs[6].introduction,"欣赏三元湖,晨读理想之地");
strcpy(G.vexs[7].name,"大学生活动中心");
strcpy(G.vexs[7].introduction,"大学生进行文化艺术娱乐活动,丰富大学生课余生活的场所");
strcpy(G.vexs[8].name,"综合楼");
strcpy(G.vexs[8].introduction,"烟大最大的教学楼,共5层,现代建筑,适宜学习");
strcpy(G.vexs[9].name,"图书馆");
strcpy(G.vexs[9].introduction,"藏书百万册,设施良好,2楼为电子阅览室,环境幽雅");
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
{
G.arcs[i][j].adj=INFINITY;
G.arcs[0][1].adj=80;
G.arcs[1][0].adj=80;
G.arcs[1][3].adj=150;
G.arcs[3][1].adj=150;
G.arcs[3][2].adj=60;
G.arcs[2][3].adj=60;
G.arcs[1][4].adj=180;
G.arcs[4][1].adj=180;
G.arcs[4][5].adj=300;
G.arcs[5][4].adj=300;
G.arcs[3][4].adj=120;
G.arcs[4][3].adj=120;
G.arcs[4][6].adj=220;
G.arcs[6][4].adj=220;
G.arcs[5][7].adj=500;
G.arcs[7][5].adj=500;
G.arcs[6][8].adj=360;
G.arcs[8][6].adj=360;
G.arcs[0][9].adj=720;
G.arcs[9][0].adj=720;
G.arcs[7][8].adj=280;
G.arcs[8][7].adj=280;
G.arcs[8][9].adj=50;}
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
G.arcs[j][i].adj=G.arcs[i][j].adj;
return G;
}//InitGraph end
void Menu()
{
printf("\n 欢迎使用烟台大学导游系统\n");
printf(" ┏━━━━━━━━━━━━━━━━━━━━┓\n");
printf(" ┃ 1.浏览校园全景 ┃\n");
printf(" ┃ 2.查看所有游览路线 ┃\n");
printf(" ┃ 3.选择出发点和目的地(最短路径) ┃\n");
printf(" ┃ 4.查看景点信息 ┃\n");
printf(" ┃ 5.退出系统 ┃\n");
printf(" ┗━━━━━━━━━━━━━━━━━━━━┛\n");
printf(" \n");
printf(" \n");
printf(" 2◆学生宿舍楼 \n");
printf(" || \n");
printf(" || \n");
printf(" 3◆ 青春广场 \n");
printf(" // || \n");
printf(" // || \n");
printf(" 0◆第一餐厅--->1◆八景园------// || \n");
printf(" || ╲╲ || \n");
printf(" || ╲╲ || \n");
printf(" || --------->4◆钟楼----------------------->5◆体育场 \n");
printf(" || | || \n");
printf(" || |---->6◆湖心岛 || \n");
printf(" || | || \n");
printf(" || | || \n");
printf(" || | || \n");
printf(" || | || \n");
printf(" ||----------------- 9◆图书馆<-----8◆综合楼--------->7◆大学生活动中心 \n");
printf("\n");
printf("\n");
printf("以上是路径图,请输入您的选择(1-5菜单选项): ");
}
void Browser(MGraph *G)
{
int v;
printf("┏━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃编号┃景点名称 ┃简介 ┃\n");
for(v=0;v<G->vexnum;v++)
printf("┃%-4d┃%-16s┃%-56s┃\n",G->vexs[v].num,G->vexs[v].name,G->vexs[v].introduction);
printf("┗━━┻━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
}
void ShortestPath_DIJ(MGraph * G)// 迪杰斯特拉算法来计算出起点到各个顶点之间的最短路径,v0为起点
{
int v,w,i,min,t=0,x,flag=1,v0;
int final[20], D[20], p[20][20];
while(flag)
{
printf("请输入一个起始景点编号:");
scanf("%d",&v0);
if(v0<0||v0>G->vexnum)
{
printf("景点编号不存在!请重新输入景点编号:");
scanf("%d",&v0);
}
if(v0>=0&&v0<G->vexnum)
flag=0;
}
for(v=0;v<G->vexnum;v++)
{
final[v]=0;
D[v]=G->arcs[v0][v].adj;
for(w=0;w<G->vexnum;w++)
p[v][w]=0;
if(D[v]<INFINITY)
{
p[v][v0]=1;p[v][v]=1;
}
}
D[v0]=0;final[v0]=1;
for(i=1;i<G->vexnum;i++)
{
min=INFINITY;
for(w=0;w<G->vexnum;w++)
if(!final[w])
if(D[w]<min){v=w;min=D[w];}
final[v]=1;
for(w=0;w<G->vexnum;w++)
if(!final[w]&&(min+G->arcs[v][w].adj<D[w]))
{
D[w]=min+G->arcs[v][w].adj;
for(x=0;x<G->vexnum;x++)
p[w][x]=p[v][x];
p[w][w]=1;
}
}
for(v=0;v<G->vexnum;v++)
{
if(v0!=v) printf("%s",G->vexs[v0].name);
for(w=0;w<G->vexnum;w++)
{
if(p[v][w]&&w!=v0) printf("-->%s",G->vexs[w].name);
t++;
}
if(t>G->vexnum-1&&v0!=v)printf(" 总路线长%dm\n\n",D[v]);
}
}//ShortestPath_DIJ end
void Floyd(MGraph *G)//佛洛依德算法计算从一个顶点到其他所有顶点的最短路径
{
int v,u,i,w,k,j,flag=1,p[10][10][10],D[10][10];
for(v=0;v<G->vexnum;v++)
for(w=0;w<G->vexnum;w++)
{
D[v][w]=G->arcs[v][w].adj;
for(u=0;u<G->vexnum;u++)
p[v][w][u]=0;
if(D[v][w]<INFINITY)
{
p[v][w][v]=1;p[v][w][w]=1;
}
}
for(u=0;u<G->vexnum;u++)//中转点
for(v=0;v<G->vexnum;v++)//源点
for(w=0;w<G->vexnum;w++)//终点
if(D[v][u]+D[u][w]<D[v][w])//不满足三角不等式就更新距离
{
D[v][w]=D[v][u]+D[u][w];
for(i=0;i<G->vexnum;i++)
p[v][w][i]=p[v][u][i]||p[u][w][i];
}
while(flag)
{
printf("请输入出发点和目的地的编号:");
scanf("%d%d",&k,&j);
if(k<0||k>G->vexnum||j<0||j>G->vexnum)//判断输入是否合法
{
printf("景点编号不存在!请重新输入出发点和目的地的编号:");
scanf("%d%d",&k,&j);
}
if(k>=0&&k<G->vexnum&&j>=0&&j<G->vexnum)
flag=0;
}
printf("%s",G->vexs[k].name);
for(u=0;u<G->vexnum;u++)
if(p[k][j][u]&&k!=u&&j!=u)
printf("-->%s",G->vexs[u].name);//输出到某个点的最短路径
printf("-->%s",G->vexs[j].name);
printf(" 总路线长%dm\n",D[k][j]);
}//Floyd 结束
void Search(MGraph *G)//查看某个景点的信息
{
int k,flag=1;
while(flag)
{
printf("请输入要查询的景点编号:");
scanf("%d",&k);
if(k<0||k>G->vexnum)
{
printf("景点编号不存在!请重新输入景点编号:");
scanf("%d",&k);
}
if(k>=0&&k<G->vexnum)
flag=0;
}
printf("┏━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃编号┃景点名称 ┃简介 ┃\n");
printf("┃%-4d┃%-16s┃%-56s┃\n",G->vexs[k].num,G->vexs[k].name,G->vexs[k].introduction);
printf("┗━━┻━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
}//Search end
int LocateVex(MGraph *G,char* v)
{
int c=-1,i;
for(i=0;i<G->vexnum;i++)
if(strcmp(v,G->vexs[i].name)==0)
{c=i;break;}
return c;
}
MGraph * CreatUDN(MGraph *G)//初始化图形,接受用户输入,在这里已经全部赋值
{
int i,j,k,w;
char v1[20],v2[20];
printf("请输入图的顶点数,弧数:");
scanf("%d%d",&G->vexnum,&G->arcnum);
printf("请输入景点的编号:、名称、简介:\n");
for(i=0;i<G->vexnum;i++)
{
printf("景点编号:");
scanf("%d",&G->vexs->num);
printf("景点名称:");
scanf("%s",G->vexs[i].name);
printf("景点简介:");
scanf("%s",G->vexs->introduction);
}
for(i=0;i<G->vexnum;i++)
for(j=0;j<G->vexnum;j++)
G->arcs[i][j].adj=INFINITY;
printf("请输入路径长度:\n");
for(k=0;k<G->arcnum;k++)
{
printf("第%d条边:\n",k+1);
printf("景点对(x,y):");
scanf("%s",v1);
scanf("%s",v2);
printf("路径长度:");
scanf("%d",&w);
i=LocateVex(G,v1);
j=LocateVex(G,v2);
if(i>=0&&j>=0)
{
G->arcs[i][j].adj=w;
G->arcs[j][i]=G->arcs[i][j];
}
}
return G;
}
void print(MGraph *G)//两景点之间不存在路径,输出10000,在这里用不到这个函数,因为各景点之间是联通的
{
int v,w,t=0;
for(v=0;v<G->vexnum;v++)
for(w=0;w<G->vexnum;w++)
{ if(G->arcs[v][w].adj==INFINITY)
printf("∞ ");
else printf("%-7d",G->arcs[v][w].adj);
t++;
if(t%G->vexnum==0)
printf("\n");
}
}
main.cpp
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include "head.h"
/******************************************************/
int main(void)
{
system("color 4f");
system("mode con: cols=140 lines=130");
cmd();
return 1;
}
/******************************************************/
运行结果:
菜单
校园全景图
校园全景信息
查找所有游览路线
选择出发点和目的地(最短路径)
查看景点信息
退出系统
课程设计总结
本次数据结构课程设计为校园导游系统,利用带权无向图图,二维数组所定义的矩阵等等。运用迪杰斯特拉算法和弗洛伊德算法求最近路径,虽有些困难,但通过实践得到更多的经验与体会。本次课程设计还存在一定的缺陷,为来访客人提供服务信息的同时再开发出管理员界面进行增删改查会更加完整。总之,通过本次课程设计,巩固加深了我对数据结构的理解,提高了综合运用本课程所学知识里的能力,独立思考解决问题这些都让我受益匪浅。