稀疏矩阵相加(三元顺序组创建,相加,输出)
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN 200 typedef struct { int i,j; int elem; }Triple;//一个点的三元组。 typedef struct { Triple Data[MAXN]; int m,n,len; //m,n记录的是这个矩阵的行与列;但本题没用到整个矩阵的行与列,因为是稀疏矩阵 }TripleMatrix; //一个矩阵的三维数组 void CreateTriple(TripleMatrix *p,int n) //因为有->,所以用指针传方便 { int cnt; for(cnt=0;cnt<n;cnt++) //i从0开始,是因为addtriple这个函数while跳出的小于号决定的 { scanf("%d%d%d",&p->Data[cnt].i,&p->Data[cnt].j,&p->Data[cnt].elem); //因为不是链表存储结构,所以不用malloc构建空间 } p->len=cnt; //for里不要再习惯i了 } void AddTriple(TripleMatrix *a,TripleMatrix *b,TripleMatrix *c) { int k,l; int temp; c->len=0; k=0,l=0; while(k<(a->len)&&l<(b->len)) //将矩阵一维展开,因为输出是从行小,再列小的顺序输出的 { //a,b同位置的点 //直接相加,同往后移一位 if((a->Data[k].i==b->Data[l].i)&&(a->Data[k].j==b->Data[l].j)) //矩阵只能是两个矩阵同行同列的元素相加。 { temp=a->Data[k].elem+b->Data[l].elem; if(temp) { c->Data[c->len].i=a->Data[k].i; c->Data[c->len].j=a->Data[k].j; c->Data[c->len++].elem=temp; //c->len++是肯定的 } k++,l++; } //a在b前的点 //1.行相同,列小的点,2行小的点。 //取a,a向后移 else if(((a->Data[k].i==b->Data[l].i)&&(a->Data[k].j<b->Data[l].j))||(a->Data[k].i<b->Data[l].i)) { c->Data[c->len].i=a->Data[k].i; c->Data[c->len].j=a->Data[k].j; c->Data[c->len++].elem=a->Data[k].elem; k++; //前一矩阵先的点 } //a在b后的点 //1.行相同,列大的点,2行大的点。 //取b,b向后移 else if(((a->Data[k].i==b->Data[l].i)&&(a->Data[k].j>b->Data[l].j))||(a->Data[k].i>b->Data[l].i)) { c->Data[c->len].i=b->Data[l].i; c->Data[c->len].j=b->Data[l].j; c->Data[c->len++].elem=b->Data[l].elem; //后一矩阵先的点 l++; } } //剩余处理 while(k<(a->len)) { c->Data[c->len].i=a->Data[k].i; c->Data[c->len].j=a->Data[k].j; c->Data[c->len++].elem=a->Data[k].elem; k++; } while(l<(b->len)) { c->Data[c->len].i=b->Data[l].i; c->Data[c->len].j=b->Data[l].j; c->Data[c->len++].elem=b->Data[l].elem; l++; } } void Print(TripleMatrix *c) { int cnt; for(cnt=0;cnt<(c->len);cnt++) { printf("%d %d %d\n",c->Data[cnt].i,c->Data[cnt].j,c->Data[cnt].elem); } } int main() { int n,m; scanf("%d%d",&n,&m); TripleMatrix a,b,c; CreateTriple(&a,n); CreateTriple(&b,m); AddTriple(&a,&b,&c); Print(&c); return 0; }