各位帮我看看程序有没有问题
下面是一个求最短路径的程序,我没有看例子,全部是根据算法自己写的,弄了几个图试了一下,貌似没有问题,但总感觉有点问题,请各位高手先看看有没有问题。如果没有问题,也可以教我怎么改进一下
程序代码:#include<stdio.h>
#include<malloc.h>
#define MAX_X 20
#define MAX_Y 20
struct Path
{
int power[MAX_X];//源点到此顶点的权和
int prev[MAX_X];//此顶点的直接前驱顶点,如果为0则是源点
};
struct Graph
{
int m;//顶点数
char P[MAX_X];//顶点信息
int G[MAX_X][MAX_Y];//边和权
};
//函数声明
Graph *create(void);//创建并录入网信息
void print(Graph *graph);//输出网的信息
Graph *create()
{
Graph *graph=(Graph *)malloc(sizeof(Graph));
printf("请输入顶点数 边数:");
int n;
scanf("%d %d",&graph->m,&n);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
graph->G[i][j]=32767;//初始化
}
printf("请输入顶点信息:\n");
for(i=0;i<graph->m;i++)
{
getchar();
printf("顶点%d:>",i+1);
scanf("%c",&graph->P[i]);
}
printf("请输入边和权<Vi,Vj,W>\n");
for(i=0;i<n;i++)
{
char Vi,Vj;
int w;
int x,y;
getchar();
printf("第%d条边:",i+1);
scanf("<%c,%c,%d>",&Vi,&Vj,&w);
for(x=0;x<graph->m;x++)
if(Vi==graph->P[x])
break;
for(y=0;y<graph->m;y++)
if(Vj==graph->P[y])
break;
graph->G[x][y]=w;
}
return graph;
}
void print(Graph *graph)
{
for(int i=0;i<graph->m;i++)
{
for(int j=0;j<graph->m;j++)
{
if(graph->G[i][j]!=32767)
{
printf("%c —> %c %d\n",graph->P[i],graph->P[j],graph->G[i][j]);
}
}
}
}
Path *MinPath(Graph *graph)
{
int queue[MAX_X],front=0,rear=0;
Path *path=(Path *)malloc(sizeof(Path));
for(int i=0;i<MAX_X;i++)//初始化
{
path->power[i]=32767;
path->prev[i]=0;
}
path->power[0]=0;
path->prev[0]=-1;
queue[rear++]=0;//源点入队
while(front!=rear)//未遍历完所有顶点
{
int k=queue[front];
for(int i=0;i<graph->m;i++)//遍历与k相关联的顶点
{
if(k==i)
continue;
if(graph->G[k][i]!=32767)//路径存在
{
if((graph->G[k][i]+path->power[k])<path->power[i])//找到 k——>i 更短的路径
{
path->power[i]=graph->G[k][i]+path->power[k];
path->prev[i]=k;//i的直接前驱为k
int j;
for(j=0;j<rear;j++)//检查是否入过队
{
if(i==queue[j])
break;
}
if(j>=rear)//未入过队
queue[rear++]=i;//i入队
}
}
}
front++;//k出队
}
return path;
}
void print_p(Path *path,Graph *graph)
{
for(int i=0;i<graph->m;i++)
{
int a[MAX_X],top=0;
if(path->prev[i]==-1)
continue;//不输入源点—>源点的路径
else
{
int n=i;
while(path->prev[n]!=0)//直接前驱不是源点
{
a[top++]=path->prev[n];//前驱顶点入栈
n=path->prev[n];//进入直接前驱顶点路径
}
printf("A —> ");
for(int j=top-1;j>=0;j--)
{
printf("%c —> ",graph->P[a[j]]);
}
printf("%c\t\t%d\n",graph->P[i],path->power[i]);
}
}
}
int main()
{
Graph *graph=create();
print(graph);
printf("\n\n");
Path *path=MinPath(graph);
print_p(path,graph);
getchar();
getchar();
getchar();
return 0;
}








