zoukankan      html  css  js  c++  java
  • 实验四 稀疏矩阵的转置及应用

    对如图的稀疏矩阵,分别利用方法一和方法二进行转置,并将转置后的矩阵输出(忽略单元格的颜色信息)

    三元组转置法

    #include<stdlib.h>
    #include<stdio.h>
    typedef struct stu
    {
        int row;
        int col;
        int num;
    }JD;
    
    int transform(JD ma[],JD mb[]) 
    {
        int col,p,n,t,k;
       if(ma[0].num==0)
        return(0);
       n=ma[0].col;
       mb[0].row=n; 
       mb[0].col=ma[0].row; 
       mb[0].num=ma[0].num;
       t=ma[0].num;
       k=1;    
       for(int i=1;i<=n;i++)
          for(p=1;p<=t;p++)
             if(ma[p].col==i)
             {  mb[k].row=ma[p].col;
                 mb[k].col=ma[p].row;
                 mb[k].num=ma[p].num;
                 k++;
              }
       return(1);
    }
    int main()
    {
        JD S1[50],S2[50];
        int a[20][20],b[20][20],m,n,l=1;
        printf("请输入要转置矩阵的大小:\n");
        scanf("%d%d",&m,&n);
        printf("请输入要转置的矩阵:\n");
        for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
        {
            scanf("%d",&a[i][j]);
        }
        for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        {
            b[i][j]=0;
         } 
        S1[0].row=m;
        S1[0].col=n;
        for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
        {
            if(a[i][j]!=0)
            {
                S1[l].row=i+1;
                S1[l].col=j+1;
                S1[l].num=a[i][j];
                l++;
            }    
        }
        S1[0].num=l-1;
        printf("转化成三元组为:\n");
        for(int i=0;i<l;i++)
        printf("%d %d %d\n",S1[i].row,S1[i].col,S1[i].num);
    
        for(int i=0;i<l;i++)
        {
        S2[i].row=0;
        S2[i].col=0;
        S2[i].num=0;}
            if(transform(S1,S2)!=1)
        {
            printf("转置失败!");
        }
        printf("转置后的三元组为:\n");
        for(int i=0;i<l;i++)
        printf("%d %d %d\n",S2[i].row,S2[i].col,S2[i].num);
        for(int i=1;i<l;i++)
        {
            b[S2[i].row-1][S2[i].col-1]=S2[i].num;
        }
        printf("转置后的矩阵为:\n");
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                printf("%d ",b[i][j]);
            }
        printf("\n");
        }
    }

    快速转置法

    #include<stdlib.h>
    #include<stdio.h>
    typedef struct stu
    {
        int row;
        int col;
        int num;
    }JD;
    
    int transform(JD ma[],JD mb[]) 
    {
        int i,j,k,l,m,n;
        if(ma[0].num==0)
        {
            return 0;
        }
        else
        {
            mb[0].row=ma[0].col;
            mb[0].col=ma[0].row;
            mb[0].num=ma[0].num;
            n=ma[0].col;
            m=ma[0].num;
            l=1;
            for(i=1;i<=n;i++)
                for(j=1;j<=m;j++)
                    if(ma[j].col==i)
                    {
                        mb[l].row=ma[j].col;
                        mb[l].col=ma[j].row;
                           mb[l].num=ma[j].num;
                        l++;
                    }
            return 1;
        }
    }
    int main()
    {
        JD S1[50],S2[50];
        int a[20][20],b[20][20],m,n,l=1;
        printf("请输入要转置矩阵的大小:\n");
        scanf("%d%d",&m,&n);
        printf("请输入要转置的矩阵:\n");
        for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
        {
            scanf("%d",&a[i][j]);
        }
        for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        {
            b[i][j]=0;
         } 
        S1[0].row=m;
        S1[0].col=n;
        for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
        {
            if(a[i][j]!=0)
            {
                S1[l].row=i+1;
                S1[l].col=j+1;
                S1[l].num=a[i][j];
                l++;
            }    
        }
        S1[0].num=l-1;
        printf("转化成三元组为:\n");
        for(int i=0;i<l;i++)
        printf("%d %d %d\n",S1[i].row,S1[i].col,S1[i].num);
    
        for(int i=0;i<l;i++)
        {
        S2[i].row=0;
        S2[i].col=0;
        S2[i].num=0;}
            if(transform(S1,S2)!=1)
        {
            printf("转置失败!");
        }
        printf("转置后的三元组为:\n");
        for(int i=0;i<l;i++)
        printf("%d %d %d\n",S2[i].row,S2[i].col,S2[i].num);
        for(int i=1;i<l;i++)
        {
            b[S2[i].row-1][S2[i].col-1]=S2[i].num;
        }
        printf("转置后的矩阵为:\n");
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                printf("%d ",b[i][j]);
            }
        printf("\n");
        }
    }
  • 相关阅读:
    Vue基础
    ES6之promise
    第13次作业--邮箱的正则表达式
    第12次作业--你的生日
    第11次作业--字符串处理
    第10次作业
    Java找回感觉的练习
    第四次博客作业-结对项目
    第9次作业--接口及接口回调
    深入面向对象——继承
  • 原文地址:https://www.cnblogs.com/accept/p/8175880.html
Copyright © 2011-2022 走看看