ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:18.13KB ,
资源ID:24795477      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/24795477.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(最短路径算法源程序代码.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

最短路径算法源程序代码.docx

1、最短路径算法源程序代码#include #include #include #define JiedianNum 6 /最大结点数#define NameLenght 3 /节点名字长度#define Infinity 10000 /若节点间没有路径距离设定为Infinitychar *JiedianNameFile=jiedianname.txt; /图的顶点-节点名char *JiedianPathFile=jiedianpath.txt; /边-节点间的连接关系char *MinPathDataFile=minpath.txt; /最短路径数据/*/* 从文件中读入结点数据 */* 函数

2、参数: */* char jiedian:存放节点名的数组 */* int *NodNum:指针变量,指向存放节点个数的变量 */* 输入数据:文本数据文件:JiedianNameFile */* 文件数据格式: */* */* */* 输出数据:指从该函数中带回到调用函数的数据,包括: */* jiedian-节点名称 */* NodeNum-节点名的个数 */* 返回值:数据读入是否成功的标志 */ /* 0-失败 1-成功 */*/int InputJiedianNode(char jiedianNameLenght,int *NodeNum ) int i,n; FILE *fp; i

3、f(!(fp=fopen(JiedianNameFile,r) printf(节点数据文件不存在n); getch(); return(0); fscanf(fp,%d,&n); if(!n) printf(文件中无节点数据!n); getch(); return(0); for(i=0;in;i+) fscanf(fp,%s,jiediani); fclose(fp); *NodeNum=n; return(1); /*/* 从文件中读入最短路径数据 */* 函数参数: */* int dist:节点间最短路径的值 */* int Path:节点间最短路径结点数据 */* int *NodN

4、um:指针变量,表示读入数据的多少 */* 输入数据:数据文件:MinPathDataFile */* 文件数据格式:二进制数据,数据存放顺序: */* */* 输出数据:指从该函数中带回到调用函数的数据,包括: */* jiedian */* Path */* NodeNum */* 返回值:数据读入是否成功的标志 */* 0-失败 1-成功 */*/int InputMinPath(int distJiedianNum,int PathJiedianNum,int *NodeNum) int n; FILE *fp; if(!(fp=fopen(MinPathDataFile,rb) pr

5、intf(最小路径数据文件不存在!n); getch(); return(0); fread(&n,sizeof(int),1,fp); fread(dist,sizeof(int),n*n,fp); fread(Path,sizeof(int),n*n,fp); fclose(fp); *NodeNum=n; return(1); /*/* 查找节点名 */* 函数参数: */* char str:存放节点名的数组 */* int n:str中数据的行数,即节点名的个数 */* char *p:指针变量,表示需要查找的节点名 */* 输入数据:全部函数参数均为输入数据 */* 输出数据:返回

6、值作为函数的输出数据 */* 查找成功:被查找的节点名在数组str中的序号 */* 查找失败:1,表示被查找的节点名未出现在数组中 */*/int search(char strNameLenght,int n,char *p) int i=0; while(in) if(!strcmp(stri,p) return(i); i+; return(-1); /*/* 计算节点间最短路径 */* 函数参数: */* 输入数据:文本数据文件:JiedianNameFile */* 文件数据格式: */* */* */* 文本数据文件:JiedianPathFile */* 文件数据格式: */*

7、*/* */* 输出数据:数据文件:MinPathDataFile */* 文件数据格式:二进制数据,数据存放顺序: */* */* 返回值: */* 说明:文本数据文件中数据间用空格或换行符格开 */*/void shorttestpath() int i,j,k,NodeNum,EgeNum,val; int arcJiedianNumJiedianNum; /权值矩阵 char jiedianJiedianNumNameLenght; /结点 int distJiedianNumJiedianNum; /最短路径长度矩阵 int PathJiedianNumJiedianNum; /最短

8、路径矩阵 char jiedian1NameLenght,jiedian2NameLenght; FILE *fp; /*-*/ /* 算法步骤: */ /* 1、读入结点数据 */ /* 2、邻接矩阵初始化:所有元素赋Infinity, */ /* 对角线元素赋0 */ /* 3、读入结点间边的数据,转换为邻接矩阵的数据 */ /* 4、路径矩阵初始化,若arcijInfinity, */ /* 则: atij=i 否则:Pathij=-1 */ /* 5、计算最短路径 */ /* 6、保存最小路径数据 */ /*-*/ /-初始化邻接矩阵- if(!InputJiedianNode(jie

9、dian,&NodeNum) return; else for(i=0;iNodeNum;i+) for(j=0;jNodeNum;j+) if(i=j) arcij=0; else arcij=Infinity; printf(%sn,jiediani); /-读入结点间边的数据- if(!(fp=fopen(JiedianPathFile,r) printf(结点间边的数据文件不存在!n); getch(); return; fscanf(fp,%d,&EgeNum); if(!EgeNum) printf(文件中无结点间边的数据!n); getch(); return; for(k=0;

10、kEgeNum;k+) fscanf(fp,%s,jiedian1); fscanf(fp,%s,jiedian2); fscanf(fp,%d,&val); i=search(jiedian,NodeNum,jiedian1); j=search(jiedian,NodeNum,jiedian2); arcij=arcji=val; fclose(fp);/-路径矩阵初始化- for(i=0;iNodeNum;i+) for(j=0;jNodeNum;j+) if(arcijInfinity)&(i!=j) Pathij=i; else Pathij=-1; /初始化 最短路径长度矩阵 di

11、st for(i=0;iNodeNum;i+) for(j=0;jNodeNum;j+) distij=arcij; /弗罗伊德算法 for(k=0;kNodeNum;k+) for(i=0;iNodeNum;i+) for(j=0;jNodeNum;j+) if(distik+distkjdistij) distij=distik+distkj; Pathij=Pathkj; /-保存城市间最短路径的信息- if(!(fp=fopen(MinPathDataFile,wb) printf(打不开文件 %s !n,MinPathDataFile); getch(); return; fwrit

12、e(&NodeNum,sizeof(int),1,fp); fwrite(dist,sizeof(int),NodeNum*NodeNum,fp); fwrite(Path,sizeof(int),NodeNum*NodeNum,fp); fclose(fp); return;/*/* 求一个节点到其它节点的最短路径 */* 函数参数: */* 输入数据:文本数据文件:JiedianNameFile */* 数据文件:MinPathDataFile */* 指定节点名,从键盘输入 */* 输出数据: */* 指定节点到其它所有节点的最短路径值和路径 */* (屏幕显式) */* 返回值: */

13、*/void One_To_Other_Path() int i,j,k,NodeNum,StartNode; char jiedianJiedianNumNameLenght; /结点 int distJiedianNumJiedianNum; /最短路径长度矩阵 int PathJiedianNumJiedianNum; /最短路径矩阵 int top,PathStackJiedianNum; char jiedian1NameLenght; FILE *fp;/*-*/ /* 算法步骤: */ /* 1、输入结点数据 */ /* 2、输入最小路径数据 */ /* 3、输入起点节点名称,并

14、确定其正确性 */ /* 方法:调用查找函数,若返回值=0则正确 */ /* 4、依次求起点节点到其它节点的最短路径 */ /* 方法:根据两节点的序号i,j在dist数组中获得 */ /* 最短路径值。根据Path数组中结点间路径 */ /* 数据的关系求的其结点序列并放入栈中, */ /* 然后依次输出栈数据。 */ /*-*/ /从文件中读入结点数据 if(!InputJiedianNode(jiedian,&NodeNum) printf(读取节点文件失败 %s !n,JiedianNameFile); getch(); return; /从文件中读入最小路径数据 if(!InputM

15、inPath(dist,Path,&NodeNum) printf(读取最短路径文件失败 %s!n,MinPathDataFile); getch(); return; /输入起点节点名 printf(请输入节点名称: ); scanf(%s,&jiedian1); k=search(jiedian,NodeNum,jiedian1); if(k0) printf(错误的节点名称 %s !n,jiedian1); getch(); return; /获得路径结点关系,并依次入栈 for(i=0;i%sn,jiediank,jiediani); printf(最短路径: %d kmn,distk

16、i); PathStacktop+=j; while(Pathkj!=k) PathStacktop+=Pathkj; j=Pathkj; /依次输出最小路径上的结点 printf(最短路经: n%s,jiediank); while(top) printf(=%s,jiedianPathStack-top); getch(); printf(nn); /*/* 求一个节点到另一个节点的最短路径 */* 函数参数: */* 输入数据:文本数据文件:JiedianNameFile */* 数据文件:MinPathDataFile */* 起点节点名,终点节点名,从键盘输入 */* 输出数据: *

17、/* 起点节点到终点节点的最短路径值和路径 */* (屏幕显式) */* 返回值: */*/void One_To_One_Path() int i,j,k,NodeNum,StartNode,EndNode; char jiedianJiedianNumNameLenght; /结点 int distJiedianNumJiedianNum; /最短路径长度矩阵 int PathJiedianNumJiedianNum; /最短路径矩阵 int top,PathStackJiedianNum; char jiedian1NameLenght,jiedian2NameLenght; FILE

18、*fp; /*-*/ /* 算法步骤: */ /* 1、输入结点数据 */ /* 2、输入最小路径数据 */ /* 3、输入起点节点和终点节点名称,并确定其正确性 */ /* 方法:调用查找函数,若返回值=0则正确 */ /* 4、求起点节点到终点节点的最短路径 */ /* 方法:根据两节点的序号i,j在dist数组中获得 */ /* 最短路径值。根据Path数组中结点间路径 */ /* 数据的关系求的其结点序列并放入栈中, */ /* 然后依次输出栈数据。 */ /*-*/ /从文件中读入结点数据 if(!InputJiedianNode(jiedian,&NodeNum) printf(读

19、取节点文件失败 %s !n,JiedianNameFile); getch(); return; /从文件中读入最小路径数据 if(!InputMinPath(dist,Path,&NodeNum) printf(读取最短路径文件失败%s !n,MinPathDataFile); getch(); return; /用户输入起点节点和终点节点 printf(请输入起始节点名称: ); scanf(%s,jiedian1); printf(请输入终止节点名称: ); scanf(%s,jiedian2); /调用查找函数, StartNode=search(jiedian,NodeNum,jie

20、dian1); EndNode=search(jiedian,NodeNum,jiedian2); if(StartNode0|EndNode%s: %d kmn,jiedian1,jiedian2,distStartNodeEndNode); i=StartNode; j=EndNode; top=0; PathStacktop+=j; /终点节点入栈 while(Pathij!=i) PathStacktop+=Pathij; /最短路径上其它结点入栈 j=Pathij; printf(最短路径:n); printf(%s,jiedian1); while(top) printf(=%s,

21、jiedianPathStack-top); getch(); return; int nemu() int num; printf(n * 最短路径路由程序*n); printf( *%15c1-全部节点%22cn, , *); printf( *%15c2-从一个节点到其他所有节点%6cn, ,*); printf( *%15c3-从一个节点到另一个节点%8cn, , *); printf( *%15c4-退出%26cn, , *); printf( *n); printf(%15c请选择 1,2,3,4: , ); do scanf(%d,&num); while(num4); return(num);void main() while(1) switch(nemu() case 1: shorttestpath(); break; case 2: One_To_Other_Path(); break; case 3: One_To_One_Path(); break; case 4: return;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1