实验四 稀疏矩阵的转置及应用
对如图的稀疏矩阵,分别利用方法一和方法二进行转置,并将转置后的矩阵输出(忽略单元格的颜色信息)
三元组转置法
#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"); } }