数据结构之矩阵快速转置

/*
	矩阵快速转置
*/
#include<stdio.h>
#include<malloc.h>
#define MaxSize 11
#define Row 11
#define Col 11

typedef struct
{
	int row,col;
	int e;
}Triple;

typedef struct
{
	Triple data[MaxSize+1];
	int m,n,len;//m代表行,n代表列,len代表长度
}TSMatrix;

//快速转置
void FastTransposeSMatrix(TSMatrix,TSMatrix *);

void main()
{
	int i,j;
	int num[Row][Col]={0};
	int a[8]={1,1,3,3,4,5,6,6};
    int b[8]={2,3,1,6,3,2,1,4};
    int c[8]={12,9,-3,14,24,18,15,-7};
	TSMatrix A,*B;
	A.m=Row-1;
	A.n=Col-1;
	A.len=8;
	for(i=1;i<=A.len;i++)
	{
		A.data[i].row=a[i-1];
		A.data[i].col=b[i-1];
		A.data[i].e=c[i-1];
		num[a[i-1]][b[i-1]]=c[i-1];
	}
	printf("\n");
    printf("转换之前:\n\n");
	for(i=1;i<Row;i++)
	{
		for(j=1;j<Col;j++)
		{
			printf("%-3d",num[i][j]);
		}
		printf("\n");
	}
	printf("\n三元组表:\n\nrow  col  v\n");
    for(i=1;i<=A.len;i++)  
    {  
        printf(" %d   %d   %d\n",A.data[i].row,A.data[i].col,A.data[i].e);  
    }  
	B=(TSMatrix *)malloc(sizeof(TSMatrix));
	FastTransposeSMatrix(A,B);
	for(i=1;i<Row;i++)
	{
		for(j=1;j<Col;j++)
		{
			num[i][j]=0;//清零
		}
	}
	for(i=1;i<=B->len;i++){
        num[B->data[i].row][B->data[i].col]=B->data[i].e;
    }
	printf("转换之后:\n\n");
	for(i=1;i<Row;i++)
	{
		for(j=1;j<Col;j++)
		{
			printf("%-3d",num[i][j]);
		}
		printf("\n");
	}
	printf("\n三元组表:\n\nrow  col  v\n");
    for(i=1;i<=B->len;i++)  
    {  
        printf(" %d   %d   %d\n",B->data[i].row,B->data[i].col,B->data[i].e);  
    }  
}

void FastTransposeSMatrix(TSMatrix A,TSMatrix *B)
{
	int num[MaxSize],cpot[MaxSize];
	int col,t,p,q;
	B->m=A.n;
	B->n=A.n;
	B->len=A.len;
	if(B->len)
	{
		for(col=1;col<=A.n;col++)
		{
			num[col]=0;//所有列的非零个数先清零
		}
		for(t=1;t<=A.len;t++)//依次扫描A矩阵
		{
			num[A.data[t].col]++;
		}
		cpot[1]=1;
		//求第col列中第一个非零元在B中的序号
		for(col=2;col<A.n;col++)
		{
			cpot[col]=cpot[col-1]+num[col-1];
		}
		for(p=1;p<=A.len;p++)
		{
			col=A.data[p].col;
			q=cpot[col];
			B->data[q].row=A.data[p].col;
			B->data[q].col=A.data[p].row;
			B->data[q].e=A.data[p].e;
			cpot[col]++;
		}
	}
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

假技术po主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值