稀疏矩阵转置经典算法

#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;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值