用稀疏矩阵的三元组进行加法

原创 2018年04月14日 23:38:08
算法思想:在进行三元组的加法时
前提条件:用while循环,它的出口条件为 i,j 都小于他们分别所对应的三元组中元素的个数。
满足前提条件的情况下,分3种情况:
1. 行列数相等;(1)相加等于零,则直接跳过,i++;j++;。(2)相加不为零,把相加后的数写下来,i++;j++;
2. A的行大于B的行;(1)写下行数小的一个,也就是B。然后进行B的j++;
3. A的行小于B的行;(1)写下行数小的一个,也就是A。然后进行A的i++;
 当 i,j 其中一个或者两个不满足前提条件时,退出循环。此时又分两种情况:
1. i>A的三元组中元素的个数并且 j<=B的三元组中的元素的个数,此时写B。写B时注意用while循环把B剩下的元素全都写下来。
2. j>B的三元组中元素的个数并且 i<=A的三元组中的元素的个数,此时写A。写A时注意用while循环把A剩下的元素全都写下来。

所以,代码如下:

#include <stdio.h>

typedef struct{
    int data[50][50];
    int r,c;
}matrix;

void creat(matrix *A)
{
    int m,n;
    printf("Please input the matric's row and col \n");
    scanf("%d",&A->r);
    scanf("%d",&A->c);
    printf("Please input the matric's array \n");
    for(m=0;m<A->r;m++)
        for(n=0;n<A->c;n++)
           scanf("%d",&A->data[m][n]);
}

void input(matrix A)
{
    int m,n;
    for(m=1;m<=A.r;m++)
        for(n=1;n<=A.c;n++)
          {
              printf("%5d",A.data[m-1][n-1]);
              if(n%A.c==0)
                 printf("\n");
          }
}

// 三元组表示
void Three(matrix B,int A[100][3])
{
    int m,n;
    int k=1;
    for(m=0;m<B.r;m++)
        for(n=0;n<B.c;n++)
            if(B.data[m][n]!=0)
        {
            A[k][0]=m;
            A[k][1]=n;
            A[k][2]=B.data[m][n];
            k++;
        }
        A[0][0]=B.r;
        A[0][1]=B.c;
        A[0][2]=k-1;
}
void display(int A[100][3])
{
    int i,j;
    for(i=0;i<=A[0][2];i++)
        for(j=0;j<3;j++)
           {
               printf("%5d",A[i][j]);
               if(j==2)
                printf("\n");
           }

}


void add(int A[100][3],int B[100][3],int C[100][3])
{
        int i=1,j=1;
        int m=1;

   while(i<=A[0][2] && j<=B[0][2])
    {
        if(A[i][0]==B[j][0] && A[i][1]==B[j][1])
           {
              if(A[i][2]+B[j][2]!=0)
                  {
                     C[m][0]=A[i][0];
                     C[m][1]=A[i][1];
                     C[m][2]=A[i][2]+B[j][2];
                     m++;
                     i++;
                     j++;
                   }
               if(A[i][2]+B[j][2]==0)
               {
                   i++;
                   j++;
               }
            }
            else
                if(A[i][0]==B[j][0] && A[i][1]<B[j][1])
            {
                C[m][0]=A[i][0];
                C[m][1]=A[i][1];
                C[m][2]=A[i][2];
                m++;
                i++;
            }
            else
                if(A[i][0]==B[j][0] && A[i][1]>B[j][1])
            {
                C[m][0]=B[j][0];
                C[m][1]=B[j][1];
                C[m][2]=B[j][2];
                m++;
                j++;
            }
            else
                if(A[i][0]>B[j][0])
            {
                C[m][0]=B[j][0];
                C[m][1]=B[j][1];
                C[m][2]=B[j][2];
                m++;
                j++;
            }
            else
                if(A[i][0]<B[j][0])
            {
                C[m][0]=A[i][0];
                C[m][1]=A[i][1];
                C[m][2]=A[i][2];
                i++;
                m++;
            }
     }
     if(i>A[0][2])
     {
         while(j<=B[0][2])
         {
             C[m][0]=B[j][0];
             C[m][1]=B[j][1];
             C[m][2]=B[j][2];
             m++;
             j++;
         }

     }
     else
        if(j>B[0][2])
     {
         while(i<=A[0][2])
         {
             C[m][0]=A[i][0];
             C[m][1]=A[i][1];
             C[m][2]=A[i][2];
             m++;
             i++;
         }

     }
         C[0][0]=A[0][0];
         C[0][1]=A[0][1];
         C[0][2]=m-1;

}
int main()
{
    int A[100][3];
    int B[100][3];
    int C[100][3];
    matrix i,j; //  创建了一个矩阵B;
    creat(&i);
    input(i);
    Three(i,A);
    printf("Display the Three \n");
    display(A);
    printf("----------------------------------\n");
    creat(&j);
    input(j);
    Three(j,B);
    printf("Display the Three \n");
    display(B);
    add(A,B,C);
    printf("----------------------------------\n");
    printf("After add display the Three \n");
    display(C);
    return 0;
}

机器学习之矩阵

-
  • 1970年01月01日 08:00

数据结构关于稀疏矩阵相加问题

近些日子也是在写数据结构的一些东西,老师出了一道题,原题是,用三元组方法储存两个稀疏矩阵,并将这两个矩阵相加。 今天下午也就那出来想了想,写了写 {CSDN:CODE:1931608} ...
  • I_amSHm
  • I_amSHm
  • 2016-10-16 15:35:21
  • 2031

稀疏矩阵乘法与加法

// whn6325689 #include #include #include #include #include #include #include #include #...
  • u013007900
  • u013007900
  • 2014-11-25 16:45:17
  • 1636

稀疏矩阵的三元组表示的实现及应用(矩阵相加)

#include #include "tup.h" int main() { TSMatrix ta,tb,tc; int A[M][N]= { ...
  • lxs146111
  • lxs146111
  • 2015-11-02 16:22:41
  • 2427

稀疏矩阵 三元组顺序表

#include using namespace std;/*所有的算法都是基于数据结构的,所以必须明确数据结构是如何设计的*/#define ELEMTYPE inttypedef struct ...
  • iamlijiangtao
  • iamlijiangtao
  • 2010-04-05 20:44:00
  • 1740

数据结构实践——稀疏矩阵相加

本文针对数据结构基础系列网络课程(5):数组与广义表的实践项目。【项目 - 稀疏矩阵相加】   采用三元组存储稀疏矩阵,设计两个稀疏矩阵相加的运算算法 提示1:两个行数、列数相同的矩阵可以相加 ...
  • sxhelijian
  • sxhelijian
  • 2015-10-07 21:06:53
  • 7875

用稀疏矩阵的三元组进行加法

算法思想:在进行三元组的加法时前提条件:用while循环,它的出口条件为 i,j 都小于他们分别所对应的三元组中元素的个数。满足前提条件的情况下,分3种情况:1. 行列数相等;(1)相加等于零,则直接...
  • Mr_cenGW
  • Mr_cenGW
  • 2018-04-14 23:38:08
  • 17

<em>稀疏矩阵</em>和<em>三元组</em>的基础理论

<em>稀疏矩阵</em>(矩阵零元素个数远大于非零元素),为节省存储空间,用<em>三元组</em>... 远大于非零元素),为节省存储空间,用<em>三元组</em> ...<em>稀疏矩阵</em>的<em>加法</em>,减法和乘法 立即下载 上传...
  • 2018年04月19日 00:00

【数组与广义表项目3-2-稀疏矩阵的三元组的加法】

采用三元组存储稀疏矩阵,设计两个稀疏矩阵相加的运算算法 /* * Copyright (c) 2015, 烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称:m...
  • xjp_xujiping
  • xjp_xujiping
  • 2015-11-04 17:01:47
  • 456

稀疏矩阵的实现(三元组存储)C++

通过三元组存储稀疏矩阵,压缩存储空间,实现存储稀疏矩阵,遍历输出等操作。...
  • J_Anson
  • J_Anson
  • 2015-11-17 15:33:45
  • 1296
收藏助手
不良信息举报
您举报文章:用稀疏矩阵的三元组进行加法
举报原因:
原因补充:

(最多只允许输入30个字)