1、课程设计报告(本科)课程: 学号: 姓名: 班级: 教师: 时间:数据结构1210441019 12104410041210441020葛程、徐双双杜明辉2012级物联网工程班程敏2014.01.02计算机科学与技术系设计名称:全国铁路运输网最佳经由问题 设计内容、目的与要求:实验内容:铁路运输网络中由铁路线和火车站的两个主要概念,譬如:1号铁路线表示京广线,2号铁路线表示京沪线等。铁路线对象包括铁路线编号,铁路线名称,起始站编号,终点站编号,该铁路 线长度,通行标志(00B客货运禁行,01B货运通行专线,10B客运通行专线,11B 客货运通行)。火车站对象包括所属铁路线编号,车站代码,车站名
2、,车站简称,离该铁路 线起点站路程及终点站路程。实验要求:(1)查询某站所属的铁路线(2)要求具备新增铁路线的管理功能(3)要求具备新增车站的管理功能(4)针对客运,货运情况能计算任何一个起始车站到任何一个终点站之间的最 短路径。并且要求能够显示出该最短路径的各个火车站的经由顺序 计划与进度安排:11.1 11.10大体规划几部分函数,设计基本的铁路图,今后在基本图上实 验铁路的基本管理功能。11.11 11.30各组员完成自己的功能函数,并尽量达到要求。12.1 12.15组员一起完成函数的组建及基本辅助函数功能的实现。12.16 12.25组员各自拿到所有的程序,开始个人调试与完善。12.
3、26 12.30组员一起讨论最后的方案,并做最后的优化。设计过程、步骤(可加页):一:设计过程:将铁路网抽象成图,然后查询中国现有的铁路网结构图,选取合适的站点数目, 构造一个简单的铁路图,在构造的铁路图上实现设计的要求。用结构体创建图, 然后再图的基础上实现算法要求。通过对题目的分析我们觉得会用到会用到数据 结构的邻接矩阵的存储图的定义,图的遍历算法(深度优先遍历),两点间最短路径查询(迪杰斯特拉算法)。使用文件的存储方式,对数据进行存储。32现行的铁路图:产艮武上想r.k-* I *一工*卜甲虫冒蒯、品E加噌舶T*升na 夫qJtwi/E恤工” 11 f 口. 4i.fta 2*i、勺I“
4、3单强门户WAfe 工*, 产胃下盟 :矍 .,, I*白把修 ,WfKN最后简单化的铁路网如下:typedef structint id;char name20;char des100;vinfo;/ 站点 typedef struct int distance;int kind;ArcCell, AdjMatrixMAX_V_NUMMAX_V_NUM; 令口接矩阵 typedef structvinfo vexsMAX_V_NUM;/ 站点数组AdjMatrix arcs;int vexnum,arcnum;MGraph;/ 图二:函数的声明和调用:void welcome。;/欢迎界面v
5、oid search_vex_info();/站点信息介绍void search_rantwo_short();/查询任意两个站点之间的一条最短简单路径void map_manage();/站点线路修改扩充void search_two_allpath();/查询两站点间所有路径void search_kh_path();/客货运类别路径查询void about();/ 关于void create_map();/初始化地图void save_map();/将程序中的图结构体写入数据文件int input_num_check(int min,int max);/数字输入检验void shorte
6、st_path_ota(int begin);/ 生成某一站点到所有其它站点的最短路 径数据void print fgx();/输出独占一行的分割线void map_add_vex();/新增站点void map_add_road();/ 新增道路void map_revise_vex();/修改站点void map_revise_road();/修改道路(引导界面)void map_reroad_in(int vid);/ 修改道路(公用嵌入函数)void map_delete_vex();/ 删除站点void map_delete_road();/ 删除道路(引导界面)void map_r
7、e_arc(int bid,int fid,int kind,int xid);/修改道路(模块函数)若修改终点:调用前需确保xid(新终点)与原终点不相同void map_de_arc(int bid,int fid);/删除道路(模块函数)void DFS_allpath(int bid,int fid,int k);/寻找两点间所有路径并输出void search_kh_kh(int kind);/ 查找所有符合类别的路径void DFS_allpath_kh(int bid,int fid,int k,int kind);/寻找两点间所有路径并判断该路径上到道路是否全为客/货运线路in
8、t DFS_allpath_kh_isinclude(int bz_i,int pa_k,int kind);/人客/ 货运线路判断较长路径是否完全包含较短路径int DFS_allpath_kh_test(int a_i,int b_i)结果与分析(可以加页):b l g 允E P4艺七 二| T可 x可供喜迎妁苦点: ,场】北京B.Jl1郑州工0北京;仁糙鹦/占当尚 口】广州蓝 口【天津站 鼻血,餐褊超包酒Hi后广电站点北京站介招二京广技 京九弑、京哈线等、 ,清输入谣点1D3;退出区, E:作业 DebugX5Up.eKE需柒杀窜鲁;两站间最短路径查询 量人起点ID 退出 就人终点退出)
9、;30 :退出)SBa喘藕翰昆明站E151贵糖01北京站到r31广州站的最短路径二M d匕京站一 CiJ Wh|3fi- 12株洲站一13】广州站一泾程共10酬风 赢入j西益k退出”口cl请请请充目查修 变川道查系 B点点贷出 站至某可供查询的站点二B北氮4】连基H】株也设计体会与建议:这次的程序软件基本上运行成功,可以简单的对已经输入的数据进行计算, 求全国铁路运输网最佳经由。但是程序较小,功能不全面,只是理论,并未实践 经过这次课程设计,通过对程序的编制,调试和运行,使我更好的掌握了图基本 性质和关于选址问题的解决方法,熟悉了各种调用的数据类型,在调试和运行过 程中使我更加的了解和熟悉程序
10、运行的环境, 提高了我对程序调试分析的能力和对错误的纠正能力。这次数据结构的程序设计,对于我来说是一个挑战。我对数据结构的学习在程序的设计中也有所体现。 课程设计是培养学生综合运用所学知 识、发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实 际工作能力的具体训练和考察过程。 随着科学技术发展的日新月异,当今计算机 应用在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握计算机 开发技术是十分重要的。在整个课程程序中,我们充分应用和调用各个程序模块,从而实现了此次程 序设计的所应该有的功能。在本组看来这就是我们在课程设计是比较成功的, 而 在这个过程中,让我们感觉收获最
11、大的就是我们都能利用这次课程设计学到很多 我们在课本上没有的知识,充分的发挥了我们的主动性,使我们自主的去学习。附录:#include #include #include #include #include #include #include #define MAX_V_NUM 100#define MAX 60000 typedef structint id;char name20;char des100;vinfo;/ 站点typedef structint distance;int kind;ArcCell, AdjMatrixMAX_V_NUMMAX_V_NUM;/ 邻接矩阵typed
12、ef structvinfo vexsMAX_V_NUM;/ 站点数组AdjMatrix arcs;int vexnum,arcnum;MGraph;/ 图MGraph G;/ 图 Gint input_exit = 0;/ 退出操作/ota 最短路径存储用变量int PMAX_V_NUMMAX_V_NUM; / 最短路径中间点记录int DMAX_V_NUM; / 到各点的最短路径int SorderMAX_V_NUM; / 最短路径根点由小到大排序/路径探寻存储用变量(使用前后必须重置为 0) int pathMAX_V_NUM; / 路径站点int visitedMAX_V_NUM; /
13、 访问标志int path_num; / 所有路径数int best_l; / 目前最短的总长度int bestl_num; / 目前总长度最短的路径途经站点个数/客运货运路径函数用存储数组int path_khMAX_V_NUMMAX_V_NUM;/ 存储暂时满足条件的客货运路径int path_kh_vnumMAX_V_NUM;/ 记录每条路径途经的站点数int path_num_bak;/ 备份所有路径数/*函数声明*/void welcome();/ 欢迎界面void search_vex_info();/ 站点信息介绍void search_rantwo_short();/ 查询任意
14、两个站点之间的一条最短简单路径void map_manage();/ 站点线路修改扩充/void search_two_allpath();/ 查询两站点间所有路径void search_kh_path();/ 客货运类别路径查询void create_map();/ 初始化地图void save_map();/ 将程序中的图结构体写入数据文件int input_num_check(int min,int max);/ 数字输入检验void shortest_path_ota(int begin);/ 生成某一站点到所有其它站点的最短路径数据void print_fgx();/ 输出独占一行的
15、分割线void map_add_vex();/ 新增站点void map_add_road();/ 新增道路void map_revise_vex();/ 修改站点void map_revise_road();/ 修改道路(引导界面)void map_reroad_in(int vid);/ 修改道路(公用嵌入函数)void map_delete_vex();/ 删除站点void map_delete_road();/ 删除道路(引导界面)void map_re_arc(int bid,int fid,int kind,int xid);/ 修改道路(模块函数) 若修改终点:调用前需确保 xi
16、d( 新终点)与原终点不相同void map_de_arc(int bid,int fid);/ 删除道路 (模块函数 )void DFS_allpath(int bid,int fid,int k);/ 寻找两点间所有路径并输出void search_kh_kh(int kind);/ 查找所有符合类别的路径void DFS_allpath_kh(int bid,int fid,int k,int kind);/ 寻找两点间所有路径并判断该路径上到道路是否全为客/ 货运线路int DFS_allpath_kh_isinclude(int bz_i,int pa_k,int kind);/ 人
17、客 /货运线路 判断较长路径是否完全包含较短路径int DFS_allpath_kh_test(int a_i,int b_i);/ 输出前检测判断较长路径是否完全包含较短路径void main()int step = -1,choose = 1;create_map();dowelcome();printf( 请输入功能序号:);step = input_num_check(0,3);if(input_exit = 1)input_exit = 0;step = -1;choose = 0;elseswitch(step)case 1:search_vex_info();break;case
18、 2:map_manage();break;case 3:search_kh_path();break; default:choose = 0;while(choose != 0);printf(n*n您已成功退出 , 欢迎下次使用 , 再见 !n 按任意键关闭窗口 );getch();/在你需要暂停的位置暂停一下,当你按一下任意键它又会继续往下执行! void welcome() int i;printf(”*n);n);printf(printf(全国铁路网最佳经由系统n);printf(n);printf( printf( printf( printf( printf( printf(n
19、);1 . 站点介绍查询n);2 .站点道路修改扩充n);3 .客货查询n);0.退出系统n);n);printf(*/ printf( 共 有 %d 个 站 点 %d 条 道 路 最 大 值 MAX 为 %d 最 多 %d 个 顶 点”,G.vexnum,G.arcnum,MAX,MAX_V_NUM);print_fgx();printf( 可供查询的站点:n);for(i=0;iG .vexnum;i+) printf( 【 %d】 %s ,G.vexsi.id,G .vexsi.name);if(i%5 = 4 & i != 0) printf(n); print_fgx();void
20、search_vex_info()int vid;doprintf( 请输入站点 ID(e: 退出 ):);vid = input_num_check(0,G .vexnum-1);if(input_exit = 1) input_exit = 0;system(cls); return;print_fgx();printf(站点【s】介绍:s,G.vexsvid.name,G .vexsvid.des); print_fgx();while(1);void search_rantwo_short()int bid,fid,i,j;do printf(请输入起点ID(e:退出):); bid
21、= input_num_check(0,G .vexnum-1);if(input_exit = 1) input_exit = 0;system(cls);return;printf( 请输入终点 ID(e: 退出 ):);fid = input_num_check(0,G .vexnum-1);if(input_exit = 1)input_exit = 0;system(cls); return;shortest_path_ota(bid);print_fgx();printf( 【 %d 】 %s 到 【 %d 】 %s 的 最 短 路 径 :,G.vexsbid.id,G .vexs
22、bid.name,G.vexsfid.id,G .vexsfid.name);print_fgx();for(i=0;i,G.vexsj.id,G .vexsj.name);printf( 全程共 %dkm,Dfid);print_fgx();while(1); void map_manage() int select;doprintf(1. 新增站点2.新增线路3.修改站点 4.修改线路 5.删除站点 6.删除线路e:退出)n请输入操作编号:”);select = input_num_check(1,6);if(input_exit = 1) input_exit = 0;system(cl
23、s);return; switch(select)case 1:map_add_vex();break;case 2:map_add_road();break;case 3:map_revise_vex();break;case 4:map_revise_road();break;case 5:map_delete_vex();break;case 6:map_delete_road();break;default:exit(1);while(1);void search_kh_path()int select;int sign=0;doprintf(1.货运2.客运3两站间最短路径查询e:退
24、出)n请输入操作编号:);select = input_num_check(1,3);if(input_exit = 1)input_exit = 0;system(cls);return; switch(select)case 1:search_kh_kh(1);break;case 2:search_kh_kh(2);break;case 3:search_rantwo_short();break; default:exit(1);while(1);/初始化地图void create_map() if(access(mmapdata.mdat,0) = 0) FILE *fp;fp = f
25、open(mmapdata.mdat,rb); if(!fp)printf(n 数据文件打开失败!n); exit(1);fread(&G ,sizeof(MGraph),1,fp); fclose(fp); elseint i,j;/站点数与道路数赋值G.vexnum = 16;G.arcnum = 20;/站点编号赋值for(i=0;iG .vexnum;i+) G.vexsi.id = i;/站点名称赋值strcpy(G.vexs0.name, 北京站);strcpy(G.vexs1.name, 郑州站);strcpy(G.vexs2.name, 株洲站);strcpy(G.vexs3.
26、name, 广州站);strcpy(G.vexs4.name, 天津站);strcpy(G.vexs5.name, 连云港站 );strcpy(G.vexs6.name, 上海站);strcpy(G.vexs7.name, 南昌站);strcpy(G.vexs8.name, 九龙站);strcpy(G.vexs9.name, 包头站);strcpy(G.vexs10.name, 乌鲁木齐站);strcpy(G.vexs11.name, 兰州站);strcpy(G.vexs12.name, 宝鸡站);strcpy(G.vexs13.name, 成都站);strcpy(G.vexs14.name,
27、 昆明站);strcpy(G.vexs15.name, 贵阳 );/站点介绍赋值);strcpy(G.vexs0.des,京广线、京九线、京哈线等、strcpy(G.vexs1.des, 京广线);strcpy(G.vexs2.des, 京广线);strcpy(G.vexs3.des, 京广线);strcpy(G.vexs4.des, 有待补充);strcpy(G.vexs5.des, 有待补充);strcpy(G.vexs6.des, 有待补充);strcpy(G.vexs7.des, 京九线);strcpy(G.vexs8.des, 京九线);strcpy(G.vexs9.des, 京包线
28、);strcpy(G.vexs10.des, 有待补充);strcpy(G.vexs11.des,有待补充);strcpy(G.vexs12.des, 有待补充);strcpy(G.vexs13.des, 有待补充);strcpy(G.vexs14.des, 有待补充);strcpy(G.vexs15.des, 有待补充);for(i=0;iMAX_V_NUM;i+)for(j=0;jMAX_V_NUM;j+) G.arcsij.distance = MAX;G.arcs01.distance=300;G .arcs01.kind=1;G.arcs04.distance=100;G .arcs
29、04.kind=2;G.arcs09.distance=300;G .arcs09.kind=2;G.arcs15.distance=400;G .arcs15.kind=1;G.arcs112.distance=200;G.arcs112.kind=1;G.arcs12.distance=300;G .arcs12.kind=1;G.arcs23.distance=400;G .arcs23.kind=1;G.arcs27.distance=300;G.arcs27.kind=2;G.arcs215.distance=250;G.arcs215.kind=2;G.arcs45.distanc
30、e=200;G .arcs45.kind=2;G.arcs56.distance=300;G .arcs56.kind=2;G.arcs67.distance=200;G .arcs67.kind=2;G.arcs78.distance=500;G .arcs78.kind=2;G.arcs911.distance=350;G .arcs911.kind=2;G.arcs1011.distance=800;G .arcs1011.kind=1;G.arcs1112.distance=200;G .arcs1112.kind=1;G.arcs1213.distance=300;G.arcs121
31、3.kind=2;G.arcs1314.distance=200;G .arcs1314.kind=2;G.arcs1415.distance=350;G.arcs1415.kind=2;for(i=0;iG .vexnum;i+)for(j=0;jj)G.arcsij = G.arcsji;save_map();/将程序中的图结构体写入数据文件void save_map()FILE *fp;fp = fopen(mmapdata.mdat,wb);if(!fp)printf(n 数据文件打开失败!n); exit(1);fwrite(&G ,sizeof(MGraph),1,fp);fclo
32、se(fp);/数字输入检验int input_num_check(int min,int max)int id,isright=0;doscanf(%d,&id);if(id=min)isright = 1;else if(getchar() = e) input_exit = 1;return 0;printf(输入有误,请重新输入(e:退出):);while(isright != 1); return id;void print_fgx() printf(nn);void shortest_path_ota(int begin) /Dijkstra( 迪杰斯特拉)算法int i,k=0,
33、v,w,finalMAX_V_NUM,min,m;/初始化 for(v=0;vG .vexnum;v+) finalv = 0; Dv = G .arcsbeginv.distance; for(w=0;wG .vexnum;w+) Pvw = 0; if(DvMAX) Pvbegin = 1; Pvv = 1; Dbegin = 0; finalbegin = 1; Sorderk = begin;for(i=1;iG .vexnum;i+) min = MAX;for(w=0;wG.vexnum;w+) if(!finalw)if(Dwmin)v = w;min = Dw;finalv =
34、 1;if(v != begin) k+; Sorderk = v; / 记录最短路径递增的站点队列for(w=0;wG .vexnum;w+)if(!finalw & (min + G.arcsvw.distance Dw)Dw = min + G .arcsvw.distance;for(m=0;mG .vexnum;m+)Pwm = Pvm;Pww = 1;void DFS_allpath(int bid,int fid,int k)int i,j;if(pathk = fid)for(i=0;i,G.vexspathi.id,G .vexspathi.name); printf( 【
35、%d 】 %s,G.vexspathk.id,G .vexspathk.name);print_fgx();path_num+;elsefor(j=0;jG .vexnum;j+)if(G .arcspathkj.distance=MAX_V_NUM)printf(站点数已达到最大值 d,按任意键返回匚MAX_V_NUM);getchar();getchar();system(cls);welcome();return;printf(新站点的编号为【d】,是否继续?(1.继续e:退出):,vid);ifgo = input_num_check(1,1);if(input_exit = 1)in
36、put_exit = 0;system(cls);welcome();return;G.vexsvid.id = vid;printf( 请输入新站点的名称:);scanf(%s,&G .vexsvid.name);printf( 请输入新站点的介绍:);scanf(%s,&G .vexsvid.des);printf( 添加站点成功!);print_fgx();G.vexnum+;G.arcnum+=newroad;save_map();vid+;while(1);void map_add_road()int bid,fid;doprintf( 请输入新增道路起始站点 ID(e: 退出 ):
37、);bid = input_num_check(0,G .vexnum-1);if(input_exit = 1)input_exit = 0;system(cls);welcome(); return;printf(请输入新增道路终止站点ID(e:退出):);fid = input_num_check(0,G .vexnum-1);if(input_exit = 1)input_exit = 0;system(cls);welcome(); return;if(fid = bid)printf( 终点与起点重复!n);continue;if(G.arcsbidfid.distanceprin
38、t_fgx();printf( 您 正 在 添 加 道 路 【 %d 】 %s【%d】 %s:n,G.vexsbid.id,G .vexsbid.name,G .vexsfid.id,G .vexsfid.name);printf( 请输入新建道路的长度( km ) :);scanf(%d,&G .arcsbidfid.distance);printf( 请输入新建道路的类型(1.货运2.客运):);scanf(%d,&G .arcsbidfid.kind);printf( 添加道路成功!);print_fgx();G.arcsfidbid = G .arcsbidfid;G.arcnum+;
39、save_map();while(1);void map_revise_vex()int vid,choose,i;do printf( 请输入需要修改的站点 ID(e: 退出 ):);vid = input_num_check(0,G .vexnum-1);if(input_exit = 1)input_exit = 0;system(cls);welcome(); return;print_fgx();printf( 站 点 信 息 预 览 :【 %d 】 %s 介 绍 :%sn,G.vexsvid.id,G .vexsvid.name,G .vexsvid.des);print_fgx();for(i=0;iG .vexnum;i+)if(G .arcsvidi.distance 【 %d 】 %s 道路信息 :长度 %dkm ,G.vexsvid.id,G.vexsvid.name,G .vexsi.id,G .vexsi.name,G .arcsvidi.distance);if(G.arcsvidi.kind = 1) printf( 类型 货运 );else printf( 类型