利用指針訪問二維數組實現floyd算法

#include<stdio.h>
//floyd算法实现
//定义一个无限大值,表示无法直接通过的两个点
#define INF 999
//初始化一个n*n的数组存储所要表示的图
#define N 3
int a [N][N] ;
//creat函数,用于初始化数组
int* creat (){

for(int i = 0 ;i<N;i++){
for(int j = 0 ;j<N;j++){
if(i==j)
a[i][j] = 0 ;
else a[i][j] = INF ;

}
}
int* p = NULL ;
p = a[0];
return p ;
}
//填充矩阵(输入图数据)
int * insert(int* p ){
for(int i = 0 ;i<N;i++){
for(int j = 0;j<N;j++){
if(i!=j){
printf("请输入第%d城市到第%d城市的距离\n",i+1,j+1);
scanf("%d",(p+i*N+j));
}
}
}
return p ;
}
//创建弗洛伊德算法(三个嵌套for循环)
int* floyd(int* p ){
for(int k = 0;k<N;k++){
for(int i = 0; i<N ;i++){
for(int j = 0 ; j<N;j++)
if(*(p+i*N+j)>*(p+i*N+k)+*(p+k*N+j))
*(p+i*N+j)=*(p+i*N+k)+*(p+k*N+j); //使用指针对二维数组内容进行修改,等价于a[i][j]=a[i][k]+a[k][j]
}
}
return p ;
}
//遍历二维数组a[N][N]
void show(int* p ){

for(int i = 1 ;i<=N*N;i++){
printf("%6d",*(p+i-1));
if(i>0&&i%N==0)printf("\n");
}
}
int main(void){
int* p = creat();
insert(p);
floyd(p);
show(p);
return 0 ;
}

------------------------------------------------------------------------------------------------

輸出内容:

请输入第1城市到第2城市的距离

2

请输入第1城市到第3城市的距离

33
请输入第2城市到第1城市的距离
6
请输入第2城市到第3城市的距离
7
请输入第3城市到第1城市的距离
44
请输入第3城市到第2城市的距离
12


0    2    9
6    0    7
18  12   0

--------------------------------

猜你喜欢

转载自www.cnblogs.com/Insertt/p/11684391.html
今日推荐