稀疏矩阵加法C语言,紧急求助~~提交后显示内存不足

#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int M,N,C;
int **rlink;
} GrossLink;

void input( GrossLink *A )
{
int m,n,c,i,j;
scanf("%d%d%d", &m,&n,&c );
A->M=m;
A->N=n;
A->C=c;
A->rlink=(int **)malloc(A->M*sizeof(int*));
for( i=0; i<A->M; i++ )
{
A->rlink[i]=(int *)malloc(A->N*sizeof(int));
for( j=0; j<A->N; j++ )
A->rlink[i][j]=0;
}

for( i=0; i<A->C; i++ )
{
scanf("%d%d%d", &m,&n,&c );
A->rlink[m][n]=c ;
}
}

void output( GrossLink A )
{
int i,j;
printf("%d %d %d\n", A.M, A.N, A.C );
for( i=0; i<A.M; i++ )
for( j=0; j<A.N; j++ )
if ( A.rlink[i][j]!=0 )
printf("%d %d %d\n", i,j,A.rlink[i][j] );
}
void add( GrossLink A, GrossLink B )
{
int i,j ;
for( i=0; i<A.M; i++ )
for( j=0; j<A.N; j++ )
if ( A.rlink[i][j]!=0 )
{
if ( B.rlink[i][j] == 0 )
B.C++ ;
B.rlink[i][j] += A.rlink[i][j] ;
}
output( B );
}

int main()
{
GrossLink A , B ;
input( &A );
input( &B );
add( A, B );
return 0;
}

既然稀疏,别开矩阵
/*************************************************************************
    > File Name: test.c
    > Author: Alleria
    > Mail: [email protected] 
    > Created Time: 2014年12月28日 星期日 16时29分50秒
 ************************************************************************/

#include <stdio.h>
#include <stdlib.h>
//#include <string.h>

typedef struct Mat
{
int r, c;
int nonZ;
int *nzr;
int *nzc;
int *nzv;
} * pMat;

void init(pMat * mat, int r, int c, int nz)
{
*mat = (pMat)calloc(1, sizeof(struct Mat));
(*mat)->r = r;
(*mat)->c = c;
(*mat)->nonZ = nz;
(*mat)->nzr = (int *)calloc(nz, sizeof(int));
(*mat)->nzc = (int *)calloc(nz, sizeof(int));
(*mat)->nzv = (int *)calloc(nz, sizeof(int));
}

void sets(pMat * mat)
{
int iter;
for(iter = 0; iter < (*mat)->nonZ; ++ iter)
{
scanf("%d", &((*mat)->nzr[iter]));
scanf("%d", &((*mat)->nzc[iter]));
scanf("%d", &((*mat)->nzv[iter]));
}
}

void set(pMat * m, int iter, int r, int c, int v)
{
(*m)->nzr[iter] = r;
(*m)->nzc[iter] = c;
(*m)->nzv[iter] = v;
}

void input(pMat * a)
{
int x, y, z;
scanf("%d", &x);
scanf("%d", &y);
scanf("%d", &z);
init(a, x, y, z);
sets(a);
}

void add(pMat a, pMat b, pMat * r)
{
int i = 0, j = 0, k = 0;
while(j < a->nonZ && k < b->nonZ)
{
if(a->nzr[j] == b->nzr[k])
{
if(a->nzc[j] == b->nzc[k])
{
set(r, i, a->nzr[j], a->nzc[j], a->nzv[j] + b->nzv[k]);
++ i;
++ j;
++ k;
}
else if(a->nzc[j] > b->nzc[k])
{
set(r, i, b->nzr[k], b->nzc[k], b->nzv[k]);
++ i;
++ k;
}
else
{
set(r, i, a->nzr[j], a->nzc[j], a->nzv[j]);
++ i;
++ j;
}
}
else if(a->nzr[j] > b->nzr[k])
{
set(r, i, b->nzr[k], b->nzc[k], b->nzv[k]);
++ i;
++ k;
}
else
{
set(r, i, a->nzr[j], a->nzc[j], a->nzv[j]);
++ i;
++ j;
}
}
while(j < a->nonZ)
{
set(r, i, a->nzr[j], a->nzc[j], a->nzv[j]);
++ i;
++ j;
}
while(k < b->nonZ)
{
set(r, i, b->nzr[k], b->nzc[k], b->nzv[k]);
++ i;
++ k;
}
(*r)->nonZ = i;
}

void print(pMat m)
{
printf("%d %d\n", m->r, m->c);
printf("%d\n", m->nonZ);
int iter;
for(iter = 0; iter < m->nonZ; ++ iter)
{
printf("%d %d %d\n", m->nzr[iter], m->nzc[iter], m->nzv[iter]);
}
}

void release(pMat * m)
{
if(m)
{
if((*m)->nzr)
{
free((*m)->nzr);
(*m)->nzr = NULL;
}
if((*m)->nzc)
{
free((*m)->nzc);
(*m)->nzc = NULL;
}
if((*m)->nzv)
{
free((*m)->nzv);
(*m)->nzv = NULL;
}
free(m);
m = NULL;
}
}

int main()
{
    //Codes
    pMat *a = (pMat *)calloc(1, sizeof(pMat));
    input(a);
    pMat *b = (pMat *)calloc(1, sizeof(pMat));
    input(b);
    pMat *r = (pMat *)calloc(1, sizeof(pMat));
    int newnz = (*a)->nonZ + (*b)->nonZ;
    init(r, (*a)->r, (*a)->c, newnz);
    add(*a, *b, r);
    print(*r);
    release(a);
    release(b);
    release(r);
    return 0;
}

追问

感谢呀~懂了!但是提交后,要求不止一个测试用例。要有多个,这个要怎么改~

追答

............在外面套个while不就解决了。。。

追问

怎么套~~求指点

追答

这。。。
不知道你的题意要求如何
按你上图给出的题意,是一例一case,就是他们跑你的程序多次,每次只输入两个矩阵
如果是一例多case,就有很多种情况
比如第一个输入就会给出case数
或者当矩阵大小为0 0的时候退出

温馨提示:答案为网友推荐,仅供参考