• 三元组


    #define  Maxsize   100
    #define  M  6
    #define  N  6
    typedef struct 
    {
        int r;//行号
        int c;//列号
        int d;//元素值
    }TupNode;
    typedef struct
    {
        int rows;//行数值
        int cols;//列数值
        int nums;//非零元素个数
        TupNode data[Maxsize];
    }TSMatrix;   //三元组顺序表定义
    //从一个二维矩阵创建其三元组表示的运算算法
    void CreatMat(TSMatrix &t,int 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)  //只存储非0元
                {
                    t.data[t.nums].r =i;
                    t.data [t.nums ].c=j;
                    t.data [t.nums ].d=A[i][j];
                    t.nums ++;
                }
            }
        }
    }
    //三元组元素赋值运算算法
    int Value(TSMatrix &t,int x,int rs,int cs) 
    {
        int i,k;
        if(rs>=t.rows || cs>=t.cols)
            return 0;
        while(k<t.nums && rs>t.data[k].r)  k++; //寻找位置
        while(k<t.nums && cs>t.data[k].c)  k++;
        if(t.data[k].r==rs && t.data[k].c==cs)
            t.data[k].d=x;   //该元素存在
        else   //该元素不存在
        {
            for(i=k;i<=t.nums ;i++) //将i后面的元素后移
            {
                t.data[i+1].r=t.data[i].r;
                t.data[i+1].c=t.data[i].c;
                t.data[i+1].d=t.data[i].d;
            }
            t.data[k].r=rs;
            t.data[k].c=cs;
            t.data[k].d=x;
            t.nums ++;
        }
        return 1;
    }
    //将指定位置的元素赋给变量的运算算法
    int Assign(TSMatrix t,int &x,int rs,int cs)
    {
        int k=0;
        if(rs>=t.rows ||cs>=t.cols)
            return 0;
        while(k<t.nums && rs>t.data[k].r)  k++;
        while(k<t.nums && cs>t.data[k].c)  k++;
        if(t.data[k].r==rs&&t.data[k].c==cs)
        {
            x=t.data[k].d;
            printf("第 %d 行第 %d 列的元素为:x=%d
    ",rs,cs,x);
            return x;
        }
        else return 0;
    }
    //输出三元组运算算法
    int  DispMat(TSMatrix t)
    {
        int i;
        if(t.nums <=0)
            return 0;
        printf("	%d	%d	%d
    ",t.rows ,t.cols ,t.nums );
        printf("------------------------------------
    ");
        for(i=0;i<t.nums ;i++)
            printf("	%d	%d	%d
    ",t.data[i].r,t.data[i].c,t.data[i].d);
        return 1;
    }
    //矩阵转置算法
    void TsanTat(TSMatrix t,TSMatrix &tb) 
    {
        int p,q=0,v;
        tb.rows =t.cols;;
        tb.cols =t.rows;
        tb.nums =t.nums;
        if(t.nums !=0)
        {
            for(v=0;v<t.cols ;v++)
            {
                for(p=0;p<t.nums  ;p++)
                {
                    if(t.data[p].c==v)
                    {
                        tb.data[q].r=t.data[p].c;
                        tb.data[q].c=t.data[p].r;
                        tb.data[q].d=t.data[p].d;
                        q++;
                    }
                }
            }
        }
    }
    //两矩阵相加运算算法
    int MatAdd(TSMatrix a,TSMatrix b,TSMatrix &c)
    {
        int i=0,j=0,k=0;
        char e;
        if(a.rows !=b.rows ||a.cols!=b.cols)
        {
            printf("这两矩阵不能相加:
    ");
            return 0;
        }
        c.rows=a.rows ;c.cols =a.cols ;
        while(i<a.nums && j<b.nums)
        {
            if(a.data[i].r==b.data[j].r)
            {
                if(a.data[i].c <b.data[j].c)
                {
                    c.data[k].r=a.data[i].r;
                    c.data[k].c=a.data[i].c;
                    c.data[k].d=a.data[i].d;
                    k++; i++;
                }
                 else if(a.data[i].c >b.data[j].c)
                {
                     c.data[k].r=b.data[j].r;
                     c.data[k].c=b.data[j].c;
                     c.data[k].d=b.data[j].d;
                     k++;
                     j++;
                }
                else 
                {
                      e=a.data[i].d+b.data[j].d;
                      if(e!=0)
                      {
                           c.data[k].r=a.data[i].r;
                           c.data[k].c=a.data[i].c;
                           c.data[k].d=e;
                           k++;
                      }
                      i++;j++;
                }
            }
            else if(a.data[k].r <b.data[j].r)
            {
                  c.data[k].r=a.data[i].r;
                  c.data[k].c=a.data[i].c;
                  c.data[k].d=a.data[i].d;
                  k++;i++;
            }
            else
            {
                 c.data[k].r=b.data[j].r;
                 c.data[k].c=b.data[j].c;
                    c.data[k].d=b.data[j].d;
                    k++;j++;
            }
            c.nums =k;
        }
        return 1;
    }
    int main(  )  //主函数
    {
        TSMatrix t,tb,tp;
        int e;
        int Array[M][N]={0,0,1,0,0,0,
                       0,2,0,0,0,0,
                       3,0,0,0,0,0,
                       0,0,0,5,0,0,
                       0,0,0,0,6,0,
                       0,0,0,0,0,7};
        CreatMat(t,Array);
        printf("该稀疏矩阵为:
    ");      DispMat(t);
        Assign(t,e,0,2);//查找元素
        TsanTat(t,tb);
        printf("转置后的矩阵为:
    ");      DispMat(tb);
        MatAdd(t,tb,tp);
        printf("两矩阵相加后所得矩阵为:
    ");  DispMat(tp);
        return 0;
    }
  • 相关阅读:
    PDA固定资产条码管理系统软件-解决固定资产实物清查的瓶颈问题,大大提高清查效率
    互联网+下PDA移动智能手持POS超市收银开单软件
    搭建免费代理池
    解析库beautifulsoup
    爬取汽车之家新闻
    请求库之requests库
    网络状态码301与302
    正向代理与反向代理
    垃圾回收机制详解
    HTTP协议详解
  • 原文地址:https://www.cnblogs.com/qxhn/p/6204055.html
Copyright © 2020-2023  润新知