各位帮我看看程序有没有问题
下面是一个求最短路径的程序,我没有看例子,全部是根据算法自己写的,弄了几个图试了一下,貌似没有问题,但总感觉有点问题,请各位高手先看看有没有问题。如果没有问题,也可以教我怎么改进一下程序代码:
#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; }