数据结构公园导游
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
c.arcs[13][22].adj=60; c.arcs[14][20].adj=90; c.arcs[15][21].adj=40;
c.arcs[20][21].adj=60; c.arcs[22][23].adj=60; c.arcs[23][24].adj=60; c.arcs[24][26].adj=100; c.arcs[25][26].adj=90; c.arcs[26][27].adj=90;
strcpy(c.vexs[16].name ,"沙滩"); strcpy(c.vexs[16].introduction ,"河边的沙滩"); strcpy(c.vexs[17].name ,"奇石"); strcpy(c.vexs[17].introduction ,"奇石大石头"); strcpy(c.vexs[18].name ,"超市"); strcpy(c.vexs[18].introduction ,"超市"); strcpy(c.vexs[19].name ,"欧阳亭"); strcpy(c.vexs[19].introduction ,"亭高3楼"); strcpy(c.vexs[20].name ," 明光塔"); strcpy(c.vexs[20].introduction ,"明光塔"); strcpy(c.vexs[21].name ," 雷峰塔"); strcpy(c.vexs[21].introduction ,"雷锋塔"); strcpy(c.vexs[22].name ," 洞庭湖"); strcpy(c.vexs[22].introduction ,"洞庭湖"); strcpy(c.vexs[23].name ," 苏提"); strcpy(c.vexs[23].introduction ,"苏提"); strcpy(c.vexs[24].name ,"灯塔"); strcpy(c.vexs[24].introduction ,"灯塔"); strcpy(c.vexs[25].name ,""); strcpy(c.vexs[25].introduction ,""); strcpy(c.vexs[26].name ,"树林"); strcpy(c.vexs[26].introduction ,"有很多树"); strcpy(c.vexs[27].name ,""); strcpy(c.vexs[27].introduction ,""); //依次输入边上的权值信息 for(i=0;i<c.vexnum ;i++) for(j=0;j<c.vexnum ;j++) c.arcs [i][j].adj =Infinity; //先初始化图的邻接矩 阵 //部分弧长 c.arcs[0][2].adj=50; c.arcs[1][4].adj=90; c.arcs[0][3].adj=60;
//图结构 //顶点向量 //邻接矩阵 //分别指定
//用于标 //用于存 //图变量
//顶点个数 //边的个数 //依次设置
strcpy(c.vexs[0].introduction ,"离公交站近"); strcpy(c.vexs[1].name ,"公园南正门"); strcpy(c.vexs[1].introduction ,"公园大门、公园班车进出 口"); strcpy(c.vexs[2].name ,"东坡亭"); strcpy(c.vexs[2].introduction ,"东坡亭,亭高3层"); strcpy(c.vexs[3].name ,"西施坡"); strcpy(c.vexs[3].introduction ,"西施坡,风光优美"); strcpy(c.vexs[4].name ,"黄蓉亭"); strcpy(c.vexs[4].introduction ,"黄蓉亭,名字来自于射雕英 雄传"); strcpy(c.vexs[5].name,"荷花塘"); strcpy(c.vexs[5].introduction ,"荷花塘,里面有很多荷花"); strcpy(c.vexs[6].name ,"广场"); strcpy(c.vexs[6].introduction ,"很大的一块空地"); strcpy(c.vexs[7].name,"花坛"); strcpy(c.vexs[7].introduction ,"里面有很多花"); strcpy(c.vexs[8].name ,"长椅"); strcpy(c.vexs[8].introduction ,"这儿有很多椅子,有人可以 做"); strcpy(c.vexs[9].name, "慈悲庵"); strcpy(c.vexs[9].introduction , "慈悲庵,慈悲庵是创建于 元代的古刹"); strcpy(c.vexs[10].name ,"云绘楼"); strcpy(c.vexs[10].introduction ,"云绘楼是一座皇家园林建 筑"); strcpy(c.vexs[11].name ,"九龙壁"); strcpy(c.vexs[11].introduction ,"整壁用彩色琉璃瓦镶砌而 成"); strcpy(c.vexs[12].name ,"白塔"); strcpy(c.vexs[12].introduction ,"白塔,高5层"); strcpy(c.vexs[13].name ,"游泳馆"); strcpy(c.vexs[13].introduction ,"室内小型游泳馆"); strcpy(c.vexs[14].name ,"彩虹桥"); strcpy(c.vexs[14].introduction ,"彩虹桥,桥上有彩虹灯"); strcpy(c.vexs[15].name ,"小木桥"); strcpy(c.vexs[15].introduction ,"小木桥,环境优雅");
6、参考文献
[1] 严蔚敏,吴伟民 编著. 数据结构(C 语言 版)--北京: 清华大学出版社,2007.2 [2]严蔚敏,吴伟民 米 宁 编著. 数据结构题集 (C 语言版)--北京: 清华大学出版社, 2007.3 [3]网上搜索相关程序作为参考
附录:
#define Infinity 1000 #define MaxVertexNum 35 #define MAX 40 #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<string.h> #include<iostream> using namespace std; typedef struct arcell 值信息 { int adj; }arcell,adjmatrix[MaxVertexNum][MaxVertexNum]; 接矩阵类型 typedef struct vexsinfo 息 { int position; 号 char name[32]; 称 char introduction[256]; 绍 }vexsinfo;
//找到,返回顶 //否则,返回-1
void path(mgraph c, int m,int n,int k) { int s,x=0; int t=k+1; //t 记载路径上 下一个中间顶点在d[]数组中的下标 if(d[k]==n && k<8) //d[k]存储路径 顶点。若d[k]是终点n且景点个数<=8,则输出该路径 { //递归出口,找 到一条路径 for(s=0;s<k;s++) printf("%s--->",c.vexs[d[s]].name); //输出该 路径。s=0 时为起点m printf("%s",c.vexs[d[s]].name); //输出最后一 个景点名(即顶点n的名字,此时s==k) printf("\n\n"); } else { s=0; while(s<c.vexnum) //从第m个顶 点,试探至所有顶点是否有路径 { if((c.arcs[d[k]][s].adj<Infinity) && (visited[s]==0)) //初态:顶点m到顶点s有边,且未被访问 { visited[s]=1; d[k+1]=s; //存储顶点编号s 至 d[k+1]中 path(c,m,n,t); //求从下标为t=k+1的第 d[t]个顶点开始的路径(递归调用),同时打印出一条m至n的路径 visited[s]=0; //将找到的路径上顶点 的访问标志重新设置为0,以用于试探新的路径 } s++; //试探从下一个顶点 s 开始是否有到终点的路径 }//endwhile
c.arcs[2][3].adj=60; c.arcs[3][4].adj=60;
c.arcs[2][8].adj=40; c.arcs[3][6].adj=40; c.arcs[4]
c.arcs[4][5].adj=70; c.arcs[4][9].adj=70; [10].adj=80; c.arcs[4][17].adj=200; c.arcs[5][7].adj=70; c.arcs[6][9].adj=40; c.arcs[7][18].adj=190; c.arcs[8][11].adj=50; c.arcs[9][12].adj=40; c.arcs[10][18].adj=70; c.arcs[11][12].adj=60; c.arcs[11][15].adj=50; c.arcs[12][16].adj=50; c.arcs[13][14].adj=40; c.arcs[14][15].adj=50; c.arcs[15][16].adj=60; c.arcs[16][17].adj=60; c.arcs[17][18].adj=80; c.arcs[18][19].adj=60; c.arcs[11][14].adj=50;
2.需求分析
(1)设计所在公园的公园平面图,所含景点不 少于十个。以图中顶点表示园内各景点,存放 景点名称、代号、简介等信息;以边表示路 径,存放路径长度等信息。 (2)为来访客人提供图中任意景点相关信息的 查询。 (3)为来访客人提供图中任意景点的问路查
询,即查询任意两个顶点之间的一条最短的简 单路径。 (4)公园导游图的景点和道路的修改扩充功 能。 (5)扩充道路信息,如道路类别(车道、人行 道),以致可按客人所需分别查询人行路径或 车行路径。 (6)扩充每个景点的林洁景点的方向等信息, 使得路径查询结果能提供详尽的导向信息。 (7)实现公园导游的仿真界面。
1.课程设计的目的
(1) 熟练使用 C ++语言编写程序,解决实际问 题; (2) 了解并掌握数据结构与算法的设计方法,具备 初步的独立分析和设计能力; (3) 初步掌握软件开发过程的问题分析、系统设 计、程序编码、测试等基本方法和技能; (4) 提高综合运用所学的理论知识和方法独立分析 和解决问题的能力;
Hale Waihona Puke Baidu
3.公园导游问题的设计
图1-1 函数调用图
4.调试分析
图1-2
图1-3
图1-4
图1-5
图1-6
5.小结
数据结构书中的迪杰斯特拉算法只能求出最 短路径中有哪个景点,但无法求出这几个景点的 经过顺序,所以先利用迪杰斯特拉算法记录下某
个顶点求出到最短路径的顺序,然后再比对哪几 个景点是最短路径里所经过的得出最短路径及景 点路过的顺序。
c.arcs[20][24].adj=80; c.arcs[22][25].adj=80;
c.arcs[24][27].adj=100;
for(i=0;i<c.vexnum ;i++) //邻接矩阵是 对称矩阵,对称赋值 for(j=0;j<c.vexnum ;j++) c.arcs[j][i].adj =c.arcs[i][j].adj ; return c; }//initgraph // (2) 查找景点在图中的序号 int locatevex(mgraph c,int v) { int i; for(i=0;i<c.vexnum ;i++) if(v==c.vexs[i].position) return i; 点序号i return -1; } //(3) 、(4) 求两景点间的所有路径 // (3) 打印序号为m,n景点间的长度不超过8个景点的路径
//边的权 //权值 //图的邻 //顶点信 //景点的编 //景点的名 //景点的介
typedef struct mgraph 信息 { vexsinfo vexs[MaxVertexNum]; (数组) adjmatrix arcs; int vexnum,arcnum; 顶点数和边数 }mgraph; //全局变量 int visited[35]; 志是否已经访问过 int d[35]; 放权值或存储路径顶点编号 mgraph campus; (大公园园) // (1) 对图初始化 mgraph initgraph() { int i=0,j=0; mgraph c; c.vexnum =28; c.arcnum =39; for(i=0;i<c.vexnum ;i++) 顶点编号 c.vexs[i].position =i; //依次输入顶点信息 strcpy(c.vexs[0].name ,"小西南门");