📄 5_4.cpp
字号:
//程序实例5_4
//三元组的矩阵转换(方法二)
#include<stdio.h>
#define M 4
#define N 5
#define Max 10
//原稀疏矩阵转换成三元组
void TriArr(int a[][N],int b[][3])
{ int i,j,k=0;
for(i=0;i<M;i++)
for(j=0;j<N;j++)
if(a[i][j]!=0)
{ k++; //k表示非零元素个数
b[k][0]=i;
b[k][1]=j;
b[k][2]=a[i][j];
}
b[0][0]=M; b[0][1]=N; b[0][2]=k; //M行N列的稀疏矩阵中,共有k个非零元素
}
//三原组实现转置
void transp_2(int a[][3],int b[][3])
{ int m,n,t,i,j;
int num[Max]; // num[]存放转置矩阵b各行非零元素的个数
int pos[Max]; // pos[]存放转置矩阵每行在b中的起始位置
m=a[0][0]; n=a[0][1]; t=a[0][2];
b[0][0]=n; b[0][1]=m; b[0][2]=t;
for(i=0;i<n;i++)
num[i]=0;
for(i=1;i<=t;i++) // 统计转置矩阵各行非零元素的个数
num[a[i][1]]++;
pos[0]=1;
for(i=1;i<n;i++) // 计算每行元素在b中的起始位置
pos[i]=pos[i-1]+num[i-1];
for(i=1;i<=t;i++)
{ j=pos[a[i][1]]; // 取a[i][1]行在b中的存储位置
b[j][0]=a[i][1];
b[j][1]=a[i][0];
b[j][2]=a[i][2];
(pos[a[i][1]])++; // 指向同一行中下一个元素的位置
}
}
void main()
{ int a[][5]={0,3,0,0,0,
0,0,0,0,0,
1,4,0,0,0,
0,0,0,0,7};
int i,j,b[5][3],c[5][3];
TriArr(a,b);
printf("原稀疏矩阵为:\n");
//输出原矩阵
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
printf("%3d",a[i][j]);
printf("\n");
}
//输出压缩后的矩阵
printf("压缩后的稀疏矩阵:\n");
for(i=0;i<=b[0][2];i++)
{ for(j=0;j<3;j++) printf("%3d",b[i][j]);
printf("\n");
}
//输出原矩阵的转置矩阵
printf("原矩阵的转置矩阵:\n");
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
printf("%3d",a[j][i]);
printf("\n");
}
//transp_1(c,b); //压缩矩阵的转置
transp_2(b,c);
//输出转置后的压缩矩阵
printf("转置后的压缩矩阵:\n");
for(i=0;i<=c[0][2];i++)
{ for(j=0;j<3;j++)
printf("%3d",c[i][j]);
printf("\n");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -