相关二维数组的一道OJ题

有关二维数组的一道OJ题
Input
输入数据有多组,每组的第一行是两个整数m和n,表示应聘MM的总共的行列数,然后是m行整数,每行有n个,m和n的定义见题目的描述。

 

Output
对于每组输入数据,输出三个整数x,y和s,分别表示选中的MM的行号、列号和分数。
note:行号和列号从一开始,如果有多个MM的分数绝对值一样,那么输出排在最前面的一个(即行号最小的那个,如果行号相同则取列号最小的那个)。 

 

Sample Input
2 3
1 4 -3
-7 3 0
 

Sample Output
2 1 -7
#include <stdio.h>
typedef struct
{
    int data;
    int pn;
} array;
array a[100][100];
int m,n;
int biggest(array **p,int m,int n);
int main()
{
    int i,j;
    int max;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        for(i=0;i<m;i++)
            for(j=0;j<n;j++)
        {
            scanf("%d",&a[i][j].data);
            if(a[i][j].data>=0)a[i][j].pn=1;
            else {a[i][j].pn=0;a[i][j].data*=-1;}
        }
        max=biggest((array**)a,m,n);
        for(i=0;i<m;i++)
        {
            {
            for(j=0;j<n;j++)
                if(a[i][j].data==max)
                {
                    printf("%d ",i+1);
                    printf("%d ",j+1);
                    break;
                }
            }
                if(a[i][j].data==max)
                    break;
        }
                a[i][j].pn?printf("%d\n",max):printf("%d\n",-max);
    }
    return 0;
}
int biggest(array **p,int m,int n)
{
    int i,max1=**p.data,j;
    for(i=0;i<m;i++)
        for(i=0;i<n;i++)
        if(*(p+n*i+j).data>max1)max1=*(p+n*i+j).data;
        return max1;
}

主要就是指针那块的问题,二维数组专递总是出错。
各位大神求解!
------解决思路----------------------
int biggest(array **p,int m,int n); -->
int biggest(array *p,int m,int n);
2维数组传递->
biggest(&a[0][0], m ,n);
max1=(*p).data;

//或者
int biggest(array p[],int m,int n);
biggest(a[0][0], m ,n);
max1=p[0].data;