题2一个海底油气集输管网在地理位置1,地理位置.2,.地理位置n设有集油平台,若存在一条从集油平台i到j的输油管线,则称集油平台i到j是直接相连的。当给定n,以及各集油平台的直接相连情况,试问哪些集油平台之间是间接相连的。算法:
输入描述: n,<集油平台1,集油平台2>,<集油平台1,集油平台3>,.,<集油平台i,集油平台j>
要求:各括号对的输出要求保证按按字典序或自然数递增排序。例如,(1,2)
#include<stdio.h>
#include<stdlib.h>
void connect_Location(int location1, int location2, int num, int **Location); //创造邻接矩阵
void check_num(int location1, int location2, int num, int **reachable, int* checknum); //创造可达矩阵
void check_Location(int **reachable, int **Location, int num); //可达矩阵减去邻接矩阵,左大右小
void output(int **Location, int num);
static int count = 0;
int main()
{
int num;
scanf("%d", &num);
//接收模块
//创造邻接矩阵,声明二维数组
int a, b;
int **Location = NULL;
Location = (int**)malloc(sizeof(int*) * num);
if (NULL == Location)
return 0;
for (int i = 0; i < num; i++)
{
Location[i] = (int*)malloc(sizeof(int) * num);
for (int j = 0; j < num; j++)
{
Location[i][j] = 0;
}
}
//创造可达矩阵,声明二维数组
int **reachable = NULL;
reachable = (int **)malloc(sizeof(int) * num);
if (NULL == reachable)
return 0;
for (int i = 0; i < num; i++)
{
reachable[i] = (int*)malloc(sizeof(int) * num);
for (int j = 0; j < num; j++)
{
reachable[i][j] = 0;
}
}
//声明一维数组,来接收输入的数据以创造可达矩阵二维数组
int *checknum = NULL;
checknum = (int*)malloc(sizeof(int) * num);
for(int i = 0; i < num; i++)
{
checknum[i] = 0;
}
//测试五个数据,后面改
int flag = 5;
while(flag--)
{
scanf("%d", &a);
scanf("%d", &b);
connect_Location(a, b, num, Location);
check_num(a, b, num, reachable, checknum);
}
//处理模块 顺便输出了
check_Location(reachable, Location, num);
return 0;
}
void check_num(int location1, int location2, int num, int** reachable, int* checknum)
{
int flag1 = 0;
for(int i = 0; i < count; i++)
{
//让location1与原有location比较,若是新location则纳入其中
if(checknum[i] == location1)
{
break;
}
flag1++;
}
if(flag1 == count)
{
checknum[count] = location1;
count++;
}
int flag2 = 0;
for(int i = 0; i < count; i++)
{
//让location2与原有location比较,若是新location则纳入其中
if(checknum[i] == location2)
{
break;
}
flag2++;
}
if(flag2 == count)
{
checknum[count] = location2;
count++;
}
//创造可达矩阵
for(int i = 0; i < count; i++)
{
for(int j = 0; j < count; j++)
{
reachable[ checknum[i] - 1 ][ checknum[j] - 1 ] = 1;
}
}
}
void connect_Location(int location1, int location2, int num, int**Location)
{
//将输入的位置对应相应的可达矩阵
Location[location1 - 1][location2 - 1] = 1;
//return Location;
}
void check_Location(int **reachable, int **Location, int num) //可达矩阵减去邻接矩阵,得到去掉相邻地方的矩阵
{
for(int i = 0; i < num; i++)
{
for(int j = 0; j < num; j++)
{
//reachable[i][j] = reachable[i][j] - Location[i][j];
if((reachable[i][j] == Location[i][j]) || i == j)
//if(*(reachable+i)+j == *(Location+i)+j)
{
reachable[i][j] = 0;
// (*(reachable+i)+j) = 0;
}
}
}
output(reachable, num);
}
void output(int **Location, int num)
{
for(int i = 0; i < num; i++)
{
for(int j = 0; j < num; j++)
{
if((i < j) && (Location[i][j] == 1)) //按要求输出左大右小,对角线不要
printf("<%d,%d>", i, j);
}
}
}
但是代码无法达到预期,求解
参考GPT和自己的思路:我理解你的问题是关于 C 语言中二维数组传参的问题,但是你提供的代码是一个关于海底油气集输管网的算法实现。请问你具体需要我解答的问题是什么?或者是否可以提供更清晰的问题描述?谢谢!
解决方案:
在使用C语言传递二维数组参数时,需要注意以下几个问题:
定义函数参数时,需要使用类似“int arr[][m]”这样的格式来定义二维数组参数,其中,m表示数组的第二个维度的长度。例如:
void func(int arr[][3]) { // 二维数组操作代码 }
在调用该函数时,直接传递二维数组参数即可。例如:
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}}; func(arr);
由于传递的是二维数组,所以需要在函数内部手动获取数组长度。例如,获取第一维的长度可以使用sizeof(arr)/sizeof(arr[0]),获取第二维的长度则可以使用sizeof(arr[0])/sizeof(arr[0][0])。例如:
void func(int arr[][3]) { int len1 = sizeof(arr)/sizeof(arr[0]); // 获取第一维长度 int len2 = sizeof(arr[0])/sizeof(arr[0][0]); // 获取第二维长度 // 二维数组操作代码 }
二维数组在内存中是以连续的一段空间存储的,指向二维数组的指针类型定义为int()[m],括号中的表明pData是一个指针。因此,需要注意数组指针的类型定义和指针的使用,例如:
void func(int (*arr)[3]) { // 二维数组操作代码 int a = arr[0][1]; // 获取第一个元素的第二个值 }
总之,需要在函数内部对数组指针进行正确的遍历和访问,以免出现错误。
需要注意的是,如果函数定义的参数为“int arr[m][n]”这样的形式,那么在函数内部就可以通过sizeof(arr)/sizeof(arr[0])来获取第一维的长度了。但如果函数定义的参数为“int arr[][n]”或“int *arr[n]”这样的形式,则无法在函数内部获取第一维的长度,需要在函数外部定义并赋值。例如:
void func(int arr[][N]) { // 二维数组操作代码 }
int main() { int arr[M][N] = {{1, 2, 3}, {4, 5, 6}}; // 定义二维数组 func(arr); // 调用函数 return 0; }
参考资料: