#include"stdio.h"
#include"stdlib.h"
#define MAXSIZE 1000 /*非零元素的个数最多为1000*/
#define ElementType int
typedef struct //元素层面定义
{
int row,col; //元素 行 和列
ElementType e; //元素的值
} Triple;
typedef struct //矩阵层面的定义
{
Triple data[MAXSIZE+1]; /* 非零元素的三元组表。data[0]未用*/
int m,n,len; /*矩阵的行数、列数和非零元素的个数*/
} TSMatrix;
/*把矩阵A转置到B所指向的矩阵中去。矩阵用三元组表表示*/
void TransposeTSMatrix(TSMatrix A,TSMatrix *B)
{
int i,j,k;
B->m=A.n; // B的行为A的列
B->n=A.m; //B的列为A的行
B->len=A.len; //非零元素赋值
if(B->len>0) //如果存在非零元素
{
j=1; /*j为辅助计数器,记录转置后的三元组在三元组表B中的下标值*/
for(k=1; k<=A.n; k++) //n为列 初始三元组从列扫描 则 生成的为行 这个为筛选作用
for(i=1; i<=A.len; i++) //扫描全部元素
if(A.data[i].col==k) //如果列匹配上 这里顺序理解不了就看138 的5.15
{
B->data[j].row=A.data[i].col;/*从头至尾扫描三元组表A,寻找col值为k的三元组进行转置*/
B->data[j].col=A.data[i].row;
B->data[j].e=A.data[i].e;
j++; /*计数器j自加,指向下一个存放转置后三元组的下标*/
}/*内循环中if的结束*/
}/* if(B->len>0)的结束*/
}/* end of TransposeTSMatrix */
int main()
{
int i,j,k=1;
TSMatrix A,*B;
int re[4][5]= {1,0,0,0,2,
3,0,0,4,0,
0,0,5,0,0,
6,0,0,0,7
},data[4][5];
printf("输出稀疏矩阵\n");
for(i=0; i<4; i++)
{
for(j=0; j<5; j++)
{
printf("%-3d",re[i][j]);
}
printf("\n");
}
printf("三元组转换\n");
A.m=4; //行列赋值
A.n=5;
for(i=0; i<A.m; i++) //这里为行
{
for(j=0; j<A.n; j++) //这里为列
{
if(re[i][j] != 0) //元素不为0
{
A.data[k].e=re[i][j]; //A从1开始
A.data[k].row=i+1; //行赋值
A.data[k].col =j+1; //列赋值
k++;
}
}
}
A.len=k;
// for(i=1; i<k; i++)
// {
// printf("%d行%d列非零元素为%d\n",A.data[i].row,A.data[i].col,A.data[i].e);
// }
//
printf("三元组矩阵转置...............\n");
B=(TSMatrix *)malloc(sizeof(TSMatrix));
TransposeTSMatrix(A,B);
k=B->len;
// printf("测试转换是否丢失数据\n");
// for(i=1; i<k; i++)
// {
// printf("%d行%d列非零元素为%d\n",(*B).data[i].row,(*B).data[i].col,(*B).data[i].e);
// }
printf("三元组转换为矩阵\n");
for(j=1; j<k; j++)
{
data[B->data[j].row-1][B->data[j].col-1] = B->data[j].e;
}
for(i=0; i<B->m; i++)
{
for(j=0; j<B->n; j++)
{
printf("%-3d",data[i][j]);
}
printf("\n");
}
return 0;
}
稀疏矩阵转置经典算法
最新推荐文章于 2024-04-04 11:13:17 发布