稀疏矩阵三元顺序组模板

稀疏矩阵三元顺序组模板

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);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值