#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#define inf 1000 //无穷大距离
#define stations 35 //总站台数
#define Max 100
typedef struct {
int sk[Max];
int top; //栈顶指针
}Stack;
void Init(Stack *S)//栈初始化
{
S->top=-1;
}
void Push(Stack *S,int e)//入栈
{
if(S->top==Max-1)//栈满,则追加空间
{
printf("栈已满,不能入栈!\n");
return ;
}
S->sk[++S->top]=e;
}
int Pop(Stack *S)//出栈
{
if(S->top==-1)
{
printf("栈已空!\n");
return 0;
}
return S->sk[S->top--];
}
int Top(Stack *S)//获取栈顶元素值
{
if(S->top==-1)
{
printf("栈已空,不能获取栈顶元素!\n");
return 0;
}
return S->sk[S->top];
}
int Size(Stack *S)//求栈中元素个数
{
int t=S->top;
int count=0;
while(t!=-1)//循环从栈顶到栈底
{
count++;
t--;
}
return count;
}
char s1[stations][5] = {"A1","A2","A3","A4","A5","A6","A7","A8","A9","A10",
"A11","A12","A13","A14","A15","A16","A17","A18",
"B1","B2","B3","B4","B5","B6","B7","B8","B9","B10",
"B11","B12","B13","B14","B15","T1","T2"} ; //字符串数组,用于记录车站的名字-大写字母
char s2[stations][5] = {"a1","a2","a3","a4","a5","a6","a7","a8","a9","a10",
"a11","a12","a13","a14","a15","a16","a17","a18",
"b1","b2","b3","b4","b5","b6","b7","b8","b9","b10",
"b11","b12","b13","b14","b15","t1","t2"} ; //字符串数组,用于记录车站的名字-小写字母
int namefind(char *s) //转换车站的名字到矩阵中
{
int i;
for(i=0;i<stations;i++)
if(strcmp(s,s1[i])==0||strcmp(s,s2[i])==0)
{
return i;//若找到则返回i
break;
}
return -1;//若没有找到则返回-1
}
void output(int dis[][stations],int path[][stations],char *V0,char *V1)
{
int s,d;
int i,j,t;
int length;
printf("起始点到目的地为:");
printf("%s->%s\n",*V0,*V1);//string中c_str()成员方法返回当前字符串的首字符地址
s=namefind(V0);
d=namefind(V1);
if(s!=-1&&d!=-1)
{
printf("\n站数为:%d\n",dis[s][d]+1); //输出站树加1包括了起始站
for(i=0;i<stations;i++)//栈
for(j=0;j<stations;j++)
{
if(i==s&&j==d) //用栈输出最短路径站点
{
printf("\n最短路径站点:");
int k=j;
Stack *S;
Init(S);//初始化栈,入栈
do
{
k=path[i][k];
Push(S,k);
}while(k!=i);
printf("%s",s1[Top(S)]);//出栈
Pop(S);
length=Size(S);
for(t=0;t<length;t++)
{
printf("->%s",s1[Top(S)]);
Pop(S);
}
printf("->%s\n",s1[d]);
break;
}
}
}
else
printf("\n你所输入的起点和终点不存在\n");
}
void floyd(int dis[][stations],int path[][stations])//图的最短路径广度优先->弗洛伊德(floyd)算法->求最短路径->path数组
{
int y,z;
int k,i,j;
for(y=0;y<stations;y++)//初始化path矩阵
for(z=0;z<stations;z++)
path[y][z]=y;
for(k=0;k<stations;k++)//Floyd算法->求解任意两点间最短距离
for(i=0;i<stations;i++)
for(j=0;j<stations;j++)
if(dis[i][j]>dis[i][k]+dis[k][j])
{
dis[i][j]=dis[i][k]+dis[k][j];
path[i][j]=path[k][j];
}
}
void createG(int distance[][stations])
{
int i,j;
//分两个阶段->绘制各站点之间的距离-邻接矩阵
int Sa[21]={0,1,2,3,4,5,6,7,8,33,9,10,11,12,34,13,14,15,16,17,0};
//初始化A环形站点及T换站点,他们在s1或s2数组中的顺序位置进行编号
for(i=0;i<20;i++)
{
distance[Sa[i]][Sa[i+1]]=1;
distance[Sa[i+1]][Sa[i]]=1;
}
int Sb[17]={18,19,20,21,22,33,23,24,25,26,27,34,28,29,30,31,32};
//初始化B直行站点及T换站点,他们在s1或s2数组中的顺序位置进行编号
for(i=0;i<16;i++)
{
distance[Sb[i]][Sb[i+1]]=1;
distance[Sb[i+1]][Sb[i]]=1;
}
}
int main()
{
int distance[stations][stations];
int path[stations][stations];
char *V0,*V1;
int i,j;
for(i=0;i<stations;i++)//初始化->邻接矩阵->赋值0和1000
{
for(j=0;j<stations;j++)
{
if(i==j)
distance[i][j]=0;
else
distance[i][j]=inf;
}
}
createG(distance);
floyd(distance,path);
printf("请输入输入起点和终点(例如A3 B7):\n");
scanf("%s %s",V0,V1);
printf("\n");
output(distance,path,V0,V1);
printf("\n");
//system("pause");
return 0;
}
改成上面的c语言,不知道那个错的。
for(i=0;i<stations;i++)
for(j=0;j<stations;j++)
{
if(i==s&&j==d) //用栈输出最短路径站点
{
printf("\n最短路径站点:");
stack<int> pathrout; //初始化栈,入栈
int k=j;
do
{
k=path[i][k];
pathrout.push(k);
}while(k!=i);
printf("%s",s1[pathrout.top()]);//出栈
pathrout.pop();
length=pathrout.size();
for(t=0;t<length;t++)
{
printf("->%s",s1[pathrout.top()]);
pathrout.pop();
}
printf("->%s\n",s1[d]);
break;
}
}
这一部分是原部分未改的c++部分。
图一的错误如何改,求各位大神!!!!!!!