c语言二维数组传参问题

题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 语言中二维数组传参的问题,但是你提供的代码是一个关于海底油气集输管网的算法实现。请问你具体需要我解答的问题是什么?或者是否可以提供更清晰的问题描述?谢谢!

  • 以下回答由chatgpt基于相关博客总结生成:

    解决方案:

    在使用C语言传递二维数组参数时,需要注意以下几个问题:

    1. 如何定义函数参数

    定义函数参数时,需要使用类似“int arr[][m]”这样的格式来定义二维数组参数,其中,m表示数组的第二个维度的长度。例如:

    void func(int arr[][3]) { // 二维数组操作代码 }

    1. 如何传递数组

    在调用该函数时,直接传递二维数组参数即可。例如:

    int arr[2][3] = {{1, 2, 3}, {4, 5, 6}}; func(arr);

    1. 如何获取数组长度

    由于传递的是二维数组,所以需要在函数内部手动获取数组长度。例如,获取第一维的长度可以使用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]); // 获取第二维长度 // 二维数组操作代码 }

    1. 注意内存布局和指针使用

    二维数组在内存中是以连续的一段空间存储的,指向二维数组的指针类型定义为int()[m],括号中的表明pData是一个指针。因此,需要注意数组指针的类型定义和指针的使用,例如:

    void func(int (*arr)[3]) { // 二维数组操作代码 int a = arr[0][1]; // 获取第一个元素的第二个值 }

    总之,需要在函数内部对数组指针进行正确的遍历和访问,以免出现错误。

    1. 无法获取第一维长度

    需要注意的是,如果函数定义的参数为“int arr[m][n]”这样的形式,那么在函数内部就可以通过sizeof(arr)/sizeof(arr[0])来获取第一维的长度了。但如果函数定义的参数为“int arr[][n]”或“int *arr[n]”这样的形式,则无法在函数内部获取第一维的长度,需要在函数外部定义并赋值。例如:

    define M 2

    define N 3

    void func(int arr[][N]) { // 二维数组操作代码 }

    int main() { int arr[M][N] = {{1, 2, 3}, {4, 5, 6}}; // 定义二维数组 func(arr); // 调用函数 return 0; }

    参考资料:

    1. C语言中的数组和指针,https://www.runoob.com/w3cnote/c-array-pointer.html
    2. 数组指针和指针数组的区别,https://blog.csdn.net/qq_31634607/article/details/78601157
    3. 函数参数传递之位运算与数组指针,https://blog.csdn.net/zhangke3016/article/details/81822461
    4. C语言——二维数组作为函数的参数,https://www.cnblogs.com/Albert-L/p/9992431.html