1需求分析
1.1课程设计目的
1.2课程设计要求
1.3运行环境
2概要设计
2.1最短路径算法的分类
2.2 Dijkstra算法的基本原理
2.3 Dijkstra算法的步骤
3详细设计
4调试与操作说明
4.1课程设计程序源程序
#include
#include
typedef int Status;
typedef Status ** Node;//node指针的指针
#define MaxNum 10000;//设置10000为无穷
#define FALSE 0;
#define TRUE 1;
Node Build (Status num )
{
int i,j,k;
Node a;
a=(Node) malloc( num * sizeof (Status *));
printf("\n请输入各路由边线的cost的权值 ,如果不存在真接连接请输入10000\n
for(i=0;i
{
a[i]=(Status *) malloc( num * sizeof (Status))
for(j=0;j
{
a[i][j]=MaxNum;
}
}
for(i=0;i
{
for(j=0;j
{
if(i!=j)
{
printf("请输入第%d个结点到第个%d结点到的权值",i+1,j+1);
scanf("%d",&k);
/*if( i>=num || j>=num )
{
printf("无效的输入!请重新输入!!");
exit(1);
}*/
a[i][j]=k;
}
else
a[i][j]=10000;
}
}
return a;
}
void ShortestPath_DIJ( Node a ,Status i ,Status v0
{
int v,w,j,l=1;
Status *final;//设置int 指针
Status min;
final=(Status *)malloc( sizeof(Status)*i );//分配空间
for(v=0;v
{
final[v]=FALSE;
pre[v]=FALSE;
D[v]=a[v0][v];
if(D[v]<10000)//找到头结点
pre[v]=v0;
}
for(v=0;v
{
if( a[v0][v]>=10000 )
l++;
}
if(l>i)
{
printf("\n从路由%d出发没有最短路径到其他端点!\n",v0+1);
exit(0);
}//v0是一个孤立的顶点
D[v0]=0;
final[v0]=TRUE;
for( j=0 ; j
{
min=MaxNum;
for( w=0 ; w
{
if( !final[w] )//判断是否已被最短路径路过
{
if( D[w]
{
v=w;
min=D[w];
}//找出最短的路径
}
}
final[v]=TRUE;
for( w=0 ; w
{
if( !final[w] && ( (min+a[v][w])
{
D[w]=min+a[v][w];
pre[w]=v;
}
}
}
}
void Show(Status *D , Status *pre ,int i ,int v0)/
{
int j,k,m,n;
int *temp;
temp=(int *)malloc(sizeof(int)*i);
for(j=0;j
{
if(j!=v0)
{
printf("\n路由[%d]到路由[%d]的最短路径长度为:%3d " ,v0+1,j+
n=j;
if(D[j]!=10000)//判断是不是有可达路径
for(k=0;k
{
temp[k]=pre[n];
if(temp[k]!=v0)//判断是不是源点自身
n=temp[k];
else
//(temp[k]==v0)//是源点跳出
break;
}
if( k==0&&D[j]!=10000&&D[j]!=0 )//当是源点时
{
printf("路由[%d]->路由[%d]",v0+1,j+1);
}
if( k!=0 &&D[j]!=10000&&D[j]!=0)//不是源点时
{
for(m=k;m>=0;m--)
{
printf("路由[%d]->",temp[m]+1);
}
printf("路由[%d]",j+1);
}
if(D[j]==10000)//没有路径
{
printf("从路由[%d]出发没有最短路径到路由[%d]!",v0+1,j+1);
}
if(D[j]==0)
{
printf("路由[%d]",v0);
}
}
}
}
void main()
{
int i,v0,choice;
int w;
Node a;
Status *D,*pre;
while(1)
{
start1:
printf("\n 请选择:\n");
printf(" 1.自己制作路由拓补图\n\n");
printf(" 2.退出!\n\n");
printf("请输入你的选择:");
scanf("%d",&choice);
if(choice==2)
break;
else if(choice>3||choice<0||choice%1!=0)
{
printf("ERROR!请重新选择\n");
goto start1;
}
switch(choice)
{
case 1:
start:
printf("请输入网络拓补中路由器总数:");
scanf("%d",&i);
if(i<=0|| i%1 !=0)
{
printf("你输入的路由器的个数有误,请重新输入\n");
goto start;
}
//printf("input the arcs:");
//scanf("%d",&j);
D=(Status *)malloc(sizeof(Status)*i);//用于存放最短路径
pre=(Status *)malloc(sizeof(Status)*i);//用于存放最短
a=Build(i);
//printf("please input the start node: ");
//scanf("%d",&v0);
/*if(v0>i)
{
printf("input errors!not excite this node!");
exit(1);
}*/
break;
}
for(v0=1;v0<=i;v0++)
{
ShortestPath_DIJ( a ,i ,v0-1 ,D , pre );
Show( D, pre, i, v0-1 );
}
printf("\n\n你是否还想再尝试一次?是请输入1,不想请输入0结束!\n请选择:");
scanf("%d",&w);
if(w!=1)
break;
}//while
}
4.2程序输出图
图4.2.1
图4.2.2
图4.2.3
4.3设计结果分析
总结
致谢
参考文献