既然稀疏,别开矩阵
/*************************************************************************
> 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的时候退出