实验四 稀疏矩阵的转置及应用

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

三元组转置法

#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");
    }
}
原文地址:https://www.cnblogs.com/accept/p/8175880.html