稀疏矩阵相加

来源:互联网 发布:网络短信免费版手机版 编辑:程序博客网 时间:2024/05/28 09:32

问题及代码:

/*  * Copyright (c) 2015, 烟台大学计算机与控制工程学院  * All rights reserved.  * 文件名称: main.cpp * 作者:高哲 * 完成日期:2015年12月13日  * 版本号:codeblocks   * 问题描述:  采用三元组存储稀疏矩阵,设计两个稀疏矩阵相加的运算算法 * 输入描述: 无* 程序输出: 见运行结果  */   #ifndef TUP_H_INCLUDED  #define TUP_H_INCLUDED  #include<stdio.h>  #define M 6  #define N 7  #define MaxSize 100  typedef int ElemType;  typedef struct  {      int r;      int c;      ElemType d;  }TupNode;  typedef struct  {      int rows;      int cols;      int nums;      TupNode data[MaxSize];  }TSMatrix;  void CreatMat(TSMatrix &t,ElemType A[M][N]);  //从一个二维稀疏矩阵创建其三元组表示  bool Value(TSMatrix &t,ElemType x,int i,int j);  //三元组元素赋值  bool Assign(TSMatrix t,ElemType &x,int i,int j); //将指定位置的元素值赋给变量  void DispMat(TSMatrix t);//输出三元组  bool MatAdd(TSMatrix a,TSMatrix b,TSMatrix &c);  #endif // TUP_H_INCLUDED  /** Copyright (c) 2015, 烟台大学计算机与控制工程学院* All rights reserved.* 文件名称: main.cpp,tup.cpp,tup.h* 作者:巩凯强* 完成日期:2015年11月1日* 版本号:codeblocks** 问题描述:  采用三元组存储稀疏矩阵,设计两个稀疏矩阵相加的运算算法* 输入描述: 无* 程序输出: 见运行结果*/#ifndef TUP_H_INCLUDED#define TUP_H_INCLUDED#include<stdio.h>#define M 6#define N 7#define MaxSize 100typedef int ElemType;typedef struct{    int r;    int c;    ElemType d;}TupNode;typedef struct{    int rows;    int cols;    int nums;    TupNode data[MaxSize];}TSMatrix;void CreatMat(TSMatrix &t,ElemType A[M][N]);  //从一个二维稀疏矩阵创建其三元组表示bool Value(TSMatrix &t,ElemType x,int i,int j);  //三元组元素赋值bool Assign(TSMatrix t,ElemType &x,int i,int j); //将指定位置的元素值赋给变量void DispMat(TSMatrix t);//输出三元组bool MatAdd(TSMatrix a,TSMatrix b,TSMatrix &c);#endif // TUP_H_INCLUDED[csharp] view plaincopyprint?#include"tup.h"  void CreatMat(TSMatrix &t,ElemType A[M][N])  {      int i,j;      t.rows=M;      t.cols=N;      t.nums=0;      for(i=0;i<M;i++)      {          for(j=0;j<N;j++)          {              if(A[i][j]!=0)              {                  t.data[t.nums].r=i;                  t.data[t.nums].c=j;                  t.data[t.nums].d=A[i][j];                  t.nums++;              }          }      }  }  bool Value(TSMatrix &t,ElemType x,int i,int j)  {      int k=0,k1;      if(i>=t.rows||j>=t.cols)          return false;      while(k<t.nums&&i>t.data[k].r)      {          k++;      }      while(k<t.nums&&i==t.data[k].r&&j>t.data[k].c)      {          k++;      }      if(t.data[k].r==i&&t.data[k].c==j)      {          t.data[k].d=x;      }      else      {          for(k1=t.nums-1;k1>=k;k1--)          {              t.data[k1+1].r=t.data[k1].r;              t.data[k1+1].c=t.data[k1].c;              t.data[k1+1].d=t.data[k1].d;          }          t.data[k].r=i;          t.data[k].c=j;          t.data[k].d=x;          t.nums++;      }      return true;  }  bool Assign(TSMatrix t,ElemType &x,int i,int j)  {      int k=0;      if(i>=t.rows||j>=t.cols)          return false;      while(k<t.nums&&i>t.data[k].r)      {          k++;      }      while(k<t.nums&&i==t.data[k].r&&j>t.data[k].c)      {          k++;      }      if(t.data[k].r==i&&t.data[k].c==j)          x=t.data[k].d;      else          x=0;      return false;  }  void DispMat(TSMatrix t)  {      int i;      if(t.nums<=0)      {          return ;      }      printf("\t%d\t%d\t%d\n",t.rows,t.cols,t.nums);      printf("\t------------------\n");      for (i=0; i<t.nums; i++)          printf("\t%d\t%d\t%d\n",t.data[i].r,t.data[i].c,t.data[i].d);  }    bool MatAdd(TSMatrix a,TSMatrix b,TSMatrix &c)  {      int i,j;      ElemType va,vb,vc;      if (a.rows!=b.rows || a.cols!=b.cols)          return false;                        //行数或列数不等时不能进行相加运算      c.rows=a.rows;      c.cols=a.cols;       //c的行列数与a的相同      c.nums=0;      for(i=0; i<M; i++)          for(j=0; j<N; j++)          {              Assign(a,va,i,j);              Assign(b,vb,i,j);              vc=va+vb;              if(vc)                  Value(c,vc,i,j);          }      return true;  }  #include"tup.h"void CreatMat(TSMatrix &t,ElemType A[M][N]){    int i,j;    t.rows=M;    t.cols=N;    t.nums=0;    for(i=0;i<M;i++)    {        for(j=0;j<N;j++)        {            if(A[i][j]!=0)            {                t.data[t.nums].r=i;                t.data[t.nums].c=j;                t.data[t.nums].d=A[i][j];                t.nums++;            }        }    }}bool Value(TSMatrix &t,ElemType x,int i,int j){    int k=0,k1;    if(i>=t.rows||j>=t.cols)        return false;    while(k<t.nums&&i>t.data[k].r)    {        k++;    }    while(k<t.nums&&i==t.data[k].r&&j>t.data[k].c)    {        k++;    }    if(t.data[k].r==i&&t.data[k].c==j)    {        t.data[k].d=x;    }    else    {        for(k1=t.nums-1;k1>=k;k1--)        {            t.data[k1+1].r=t.data[k1].r;            t.data[k1+1].c=t.data[k1].c;            t.data[k1+1].d=t.data[k1].d;        }        t.data[k].r=i;        t.data[k].c=j;        t.data[k].d=x;        t.nums++;    }    return true;}bool Assign(TSMatrix t,ElemType &x,int i,int j){    int k=0;    if(i>=t.rows||j>=t.cols)        return false;    while(k<t.nums&&i>t.data[k].r)    {        k++;    }    while(k<t.nums&&i==t.data[k].r&&j>t.data[k].c)    {        k++;    }    if(t.data[k].r==i&&t.data[k].c==j)        x=t.data[k].d;    else        x=0;    return false;}void DispMat(TSMatrix t){    int i;    if(t.nums<=0)    {        return ;    }    printf("\t%d\t%d\t%d\n",t.rows,t.cols,t.nums);    printf("\t------------------\n");    for (i=0; i<t.nums; i++)        printf("\t%d\t%d\t%d\n",t.data[i].r,t.data[i].c,t.data[i].d);}bool MatAdd(TSMatrix a,TSMatrix b,TSMatrix &c){    int i,j;    ElemType va,vb,vc;    if (a.rows!=b.rows || a.cols!=b.cols)        return false;                        //行数或列数不等时不能进行相加运算    c.rows=a.rows;    c.cols=a.cols;       //c的行列数与a的相同    c.nums=0;    for(i=0; i<M; i++)        for(j=0; j<N; j++)        {            Assign(a,va,i,j);            Assign(b,vb,i,j);            vc=va+vb;            if(vc)                Value(c,vc,i,j);        }    return true;}
#include "tup.h"  int main()  {      TSMatrix ta,tb,tc;      int A[M][N]=      {          {0,0,1,0,0,0,0},          {0,2,0,0,0,0,0},          {3,0,0,0,0,0,0},          {0,0,0,5,0,0,0},          {0,0,0,0,6,0,0},          {0,0,0,0,0,7,4}      };      int B[M][N]=      {          {0,0,10,0,0,0,0},          {0,0,0,20,0,0,0},          {0,0,0,0,0,0,0},          {0,0,0,50,0,0,0},          {0,0,20,0,0,0,0},          {0,0,0,10,0,0,4}      };      CreatMat(ta,A);      CreatMat(tb,B);      printf("A:\n");      DispMat(ta);      printf("B:\n");      DispMat(tb);      if(MatAdd(ta, tb, tc))      {          printf("A+B:\n");          DispMat(tc);      }      else      {          printf("相加失败\n");      }      return 0;  }  
运行结果:
<img src="http://img.blog.csdn.net/20151213143831098?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />


 

知识点总结:

采用三元组存储稀疏矩阵的算法,将两个稀疏矩阵相加

0 0
原创粉丝点击