稀疏矩阵三元顺序组模板
typedef struct
{
int row,col;
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;
printf("\n);
for(cnt=0;cnt<(c->len);cnt++)
{
printf("%d %d %d\n",c->Data[cnt].i,c->Data[cnt].j,c->Data[cnt].elem);
}
}