问题描述:

创建一个至少有15个点的有向网表示的某个旅游景点的导游图。顶点代表景点,类型为字符串(例如,泰山导游图:“天地广场门”,“十八盘”,“冯玉祥墓”,“桃花峪门”,“中天门”,“南天门”,“玉皇顶”等),弧表示两个景点之间可以直达,弧上的权值表示两个景点之间的路程(公里数),弧上还有到达方法的信息(有步行和索道两种)。建立一个游客咨询系统。

1.基本要求

(1)创建图的存储结构。

(2)输入两个景点名,就可以得到从一个景点到达另一个景点的所有简单路径、相应路径的路程公里数、行走的方法(每一段是步行,还是坐索道);

(3)输入两个景点名,就可以得到其最短路径,即:路程最短的行进方法;如果两者无路径可通,就得出“两景点不可达的信息”。

2.重点、难点

重点:

(1)通过实验掌握图状结构数据的存储与表式;

(2)通过实验掌握对图的存储、遍历、运算等各种操作;

(3)深入理解图的特征及应用;

难点:

(1)任意两个景点所有路径的计算;

(2)最短路径的计算与算法设计。

代码示例:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define N 15
#define MAX 999int min_len[N];
int route[N][N];
int visited[N];
int flag[N];
int stack[N];
int path[N][N];
int temp[N][N];
int start=99,end=99;
int v,w,m=1;
int static n=0;typedef struct
{char name[N][20];int length[N][N];char way[N][N];
}Point;void init_path()
{int i,k;for(i=0;i<N;i++){path[i][0]=start;path[i][1]=i;for(k=2;k<N;k++)path[i][k]=999;}
}
void read_file(Point *info)
{int i=0,j;char ch[N][10];FILE *fp1,*fp2,*fp3;if((fp1=fopen("view_name.txt","r"))==NULL){printf("Open failed!!!\n");exit(0);}if((fp2=fopen("view_length.txt","r"))==NULL){printf("can not open file!");exit(0);}if((fp3=fopen("view_way.txt","r"))==NULL){printf("can not open file!");exit(0);}for(i=0;i<N;i++)fscanf(fp1,"%s",&info->name[i]);fclose(fp1);for(i=0;i<N;i++){for(j=0;j<N;j++){fscanf(fp2,"%d",&info->length[i][j]);temp[i][j]=info->length[i][j];}}fclose(fp2);for(i=0;i<N;i++){for(j=0;j<N;j++)fscanf(fp3,"%c",&info->way[i][j]);}fclose(fp3);
}void output_view(Point *info)
{int i,j;printf("一共有%d个景点,关系如下:\n\n     ",N);for(i=0;i<N;i++)printf("%-7s",info->name[i]);printf("\n");for(i=0;i<N;i++)for(j=0;j<=N;j++){if(j==0)printf("%-3s",info->name[i]);if(j!=N)printf("%4d(%c)",info->length[i][j],info->way[i][j]);else printf("\n");}
}void Dijkstra(Point *info)
{int i=1,j,min;for(v=0;v<N;v++)                //循环初始化{flag[v]=0;min_len[v]=info->length[start][v];for(w=0;w<N;w++)route[v][w]=0;              //设空路径if(min_len[v]<MAX){route[v][start]=1;route[v][v]=1;}}min_len[start]=0;flag[start]=0;         //初始化start顶点属于集合Sfor(i=1;i<N;i++)        //开始主循环 每次求得v0到某个顶点v的最短路径 并加v到集合S中{min=MAX;for(w=0;w<N;w++)if(!flag[w])       //如果w顶点在V-S中{//这个过程最终选出的点 应该是选出当前V-S中与S有关联边//且权值最小的顶点 书上描述为当前离start最近的点if(min_len[w]<min){v=w;min=min_len[w];}}flag[v]=1;                                 //选出该点后加入到合集S中for(w=0;w<N;w++)                            //更新当前最短路径和距离{if(!flag[w]&&(min+info->length[v][w]<min_len[w])){for(j=0;j<N;j++)path[w][j]=path[v][j];for(j=0;j<N;j++)if(path[w][j]==999) {path[w][j]=w;break;}min_len[w]=min+info->length[v][w];route[w][w]=1;}}}
}void DFS(Point *info,int p)
{int i,j,len;visited[p]=1;for(i=0;i<N;i++){if(info->length[p][i]!=MAX){if(i==end){n++;printf("第%d条: ",n);for(j=0;j<m;j++){stack[m]=end;//printf("(%d,%s,%c)-->",stack[j]+1,info->name[stack[j]],info->way[stack[j]][stack[j+1]]);printf("(%s)---%c--->",info->name[stack[j]],info->way[stack[j]][stack[j+1]]);}//printf("%d(%s)\n\n",end+1,info->name[end]);printf("(%s)\n\n",info->name[end]);}else if(!visited[i]){info->length[p][i]=MAX;visited[i]=1;stack[m]=i;m++;DFS(info,i);info->length[p][i]=temp[p][i];visited[i]=0;m--;}}}
}void receive(Point *info)
{int i;char a[20],b[20];printf("\n输入起点和终点标号,按# #退出:");scanf("%s%s",a,b);printf("得出所有简单路径和最短路径\n");if(strcmp(a,"#")==0&&strcmp(b,"#")==0)return;for(i=0;i<N;i++){if(strcmp(a,info->name[i])==0)start=i;if(strcmp(b,info->name[i])==0)end=i;}init_path();//for(i=0;i<N;i++)printf(" %d ",min_len[i]);if(start==99||end==99)printf("输入错误,请重新输入景点名\n");else{Dijkstra(info);//for(i=0;i<N;i++)printf(" %d ",min_len[i]);//printf("@%d %d %d",start,end,min_len[end]);if(min_len[end]!=MAX){printf("景点%s到景点%s最短路径长度为:%d\n所有简单路径:\n",info->name[start],info->name[end],min_len[end]);for(i=0;i<N;i++)visited[i]=0;stack[0]=start;DFS(info,start);printf("一共有%d条路径!\n",n);printf("景点%s到景点%s最短路径长度为:%d\n",info->name[start],info->name[end],min_len[end]);printf("最短路径为: ");for(i=0;i<N;i++){if(path[end][i+1]==999)break;//printf("(%d,%s)--%c-->",path[end][i]+1,info->name[path[end][i]],info->way[path[end][i]][path[end][i+1]]);printf("(%s)---%c--->",info->name[path[end][i]],info->way[path[end][i]][path[end][i+1]]);}//printf("%d(%s)\n",path[end][i]+1,info->name[path[end][i]]);printf("(%s)\n",info->name[path[end][i]]);}else {printf("\n非常抱歉!!!景点%s无法到达%s",info->name[start],info->name[end]);}printf("\n");}start=end=99;n=0;
}int main()
{int i,j=0;char x;Point *view_info=NULL;view_info=(Point *)malloc(sizeof(Point));read_file(view_info);msgbox(view_info);printf("输入操作:");while(scanf("%c",&x)!=EOF){switch(x){case 'S':msgbox(view_info);receive(view_info);printf("输入操作:");break;case 'E':exit(0);default :cur_sys();msgbox(view_info);printf("输入操作:");continue;}}printf("谢谢使用!!!");
}

写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

C语言C++编程学习交流圈子,QQ群:805343586点击进入】微信公众号:C语言编程学习基地

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

编程学习视频分享:

课程设计:旅游管理系统,C语言+图结构带你轻松完成作业相关推荐

  1. 数据结构课程设计—同学录管理系统(c语言)

    数据结构课程设计-同学录管理系统(c语言) 文章目录 前言 一.需求分析 二.总体设计 三.代码实现 四.代码说明 前言 计算机相关专业在学习数据结构这门课程时会有课程设计,我被分配到的是同学录管理系 ...

  2. c语言课程设计订单管理系统,C语言课程设计订单管理系统讲解.doc

    C语言课程设计订单管理系统讲解 C语言课程设计 随米打印订单管理系统 学 院: 计算机与信息科学学院 学生姓名: 谢润发 指导教师: 王新祥 职称 教授 专 业: 网络工程 班 级: 1501 完成时 ...

  3. 计算机课程设计收费管理系统,C语言机房收费管理系统课程设计

    <C语言机房收费管理系统课程设计>由会员分享,可在线阅读,更多相关<C语言机房收费管理系统课程设计(15页珍藏版)>请在人人文库网上搜索. 1.课程设计报告课程设计题目:机房收 ...

  4. 汽车销售管理系统 c语言版 课程设计,汽车销售管理系统c语言版.docx

    Document serial number[NL89WT-NY98YT-NC8CB-NNUUT-NUT108] Document serial number[NL89WT-NY98YT-NC8CB- ...

  5. 汽车销售管理系统 c语言版 课程设计,汽车销售管理系统C语言版.doc

    实用文档 文案大全 西安郵電大學 C语言课程设计报告 题 目:汽车销售管理系统 院系名称: 专业名称: 班 级: 学生姓名: 学号(8位): 指导教师: 设计起止时间: 设计目的 1. 对c语言基本知 ...

  6. c语言人事管理课程设计,人事管理系统--c语言课程设计.doc

    人事管理系统--c语言课程设计 本科生C语言课程设计论文 课程名称 C语言课程设计 教师姓名 朱莉 本科生姓名 李百蝉 本科生学号 20111002986 本科生专业 地质学 所在院系 地球科学学院 ...

  7. c语言停车场管理系统课程设计,停车场管理系统—C语言课程设计

    <停车场管理系统-C语言课程设计>由会员分享,可在线阅读,更多相关<停车场管理系统-C语言课程设计(12页珍藏版)>请在人人文库网上搜索. 1.精品好资料学习推荐停车场管理系统 ...

  8. 课程设计图书管理系统c语言,图书管理系统c语言课程设计c语言课程设计作业获得95分全院第一......

    > 下载中心  >   > 图书管理系统 c语言课程设计 english version 图书管理系统 c语言课程设计 所属分类: 开发工具:c/c++ 文件大小:2720kb 下载 ...

  9. c语言课程设计同学录管理系统,c语言课程设计 同学录

    这是一个C语言课程设计,内容简单明了. #include #include #include #include typedef struct classmate { char num[15]; cha ...

最新文章

  1. 一款SQL自动检查神器,再也不用担心SQL出错了,自动补全、回滚等功能大全
  2. C++文件输入和输出
  3. SAP Commerce Cloud ( 电商云 ) 路由路径的自定义配置与开发
  4. css 写打印样式问题
  5. linux exfat分区格式化,技术|如何在 Linux 上将 USB 盘格式化为 exFAT
  6. Android 基本开发规范(必读)
  7. 谷歌中巨大的 SEO 骗局!排名靠前的 HTML 编辑器也不可信
  8. 荷兰 转专业申请计算机,荷兰留学转专业申请须知
  9. 谁说80后的人不负责任!
  10. 教你轻松解决苹果Mac安装Axure首次打开报错的问题
  11. phpexcel读取输出操作
  12. 人和人之间不要靠的太近
  13. other|使用php调用aws sns服务发送短信通知
  14. [sql面试经验] 经典sql面试题及答案第2期
  15. dev-cpp linux,QT4+Devcpp开发环境搭建(参照网上资料整理)
  16. Itextpdf添加页眉页脚页码
  17. walking与Matlab入门教程-介绍示例模型
  18. [noip2005]篝火晚会
  19. matlab量化矩阵,MATLAB量化金融分析基础与实战/MATLAB工程应用书库
  20. 窥探现代浏览器架构(四)

热门文章

  1. 1^3+2^3+3^3+...+n^3通项公式
  2. 哈佛商学院 MBA 课程介绍
  3. 2 Resnet系列网络模型改进
  4. XRP突破在即?瑞波公司投资5亿美元只为增加XRP用例
  5. 北京地铁运营线路图,1号线,2号线,5号线,8号线,10号线,13号线,八通线和机场快轨
  6. 用通俗易懂的方式讲解:主成分分析(PCA)算法及案例(Python 代码)
  7. 关于Ajax请求问题的总结
  8. 超级强烈推荐二十个超超超超超超超超超超超级极致走心的工具(呕心沥血搜寻到)
  9. 这7个稀奇古怪的小网站,让我摸了一天的鱼!太上瘾啦!
  10. Cris 的 Scala 笔记整理(七):面向对象