利用三元组存储的稀疏矩阵的转置(列序递增与快速定位)

#include<bits/stdc++.h>
using namespace std;
#define maxsize 50
typedef int eletype;
typedef struct{
	int line;//行值 
	int column;//列值 
	eletype value;//节点数值 
}Nodes;//单个节点的定义 
typedef struct{
	Nodes node[maxsize];
	int num;//三元组含节点个数 
	int linenum;//三元组行总数 
	int columnnum;//三元组列总数 
}trmatrix;//三元组定义 
//普通转置法

//void zhuanzhi1(eletype a[][],eletype b[][]){
//	for(int i =0;i<m;i++)
//	{
//		for(int j=0;j<n;j++)
//		{
//			b[i][j]=a[j][i];
//		}
//	}
//} 


//列序递增转置法 (原理是用position数组记录每一行第一个元素位置) 
bool zhuanzhi(trmatrix a,trmatrix *b){
	int i,j,k;
	b->linenum=a.columnnum;
	b->columnnum=a.linenum;
	b->num=a.num;
	if(b->num>0){
		j=0;
		for(k=1;k<=a.columnnum;k++)
		{
			for(i=0;i<a.num;i++)
			{
				if(a.node[i].column==k){
					b->node[j].line=a.node[i].column;
					b->node[j].column=a.node[i].line;
					b->node[j].value=a.node[i].value;
					j++;					
				}
			}
		}
	}
}
//一次快速重定位
void fasttsmatrix(trmatrix a,trmatrix *b){
	int col,t,p,q;
	int num[maxsize],position[maxsize];
	b->num=a.num;b->columnnum=a.linenum;b->linenum=a.columnnum;
	if(b->num>0){
		
		for(col=1;col<=a.columnnum;col++){
			num[col]=0;
		}
		for(t=0;t<a.num;t++){
			num[a.node[t].column]++;
		}
		position[1]=0;
		for(col=2;col<=a.columnnum;col++){
			position[col]=position[col-1]+num[col];
		}
		for(p=0;p<a.num;p++){
			col=a.node[p].column;q=position[col];
			b->node[q].value=a.node[p].value;
			b->node[q].column=a.node[p].line;
			b->node[q].line=a.node[p].column;
			position[col]++;
		}
	}
} 

//打印矩阵 
void prints(trmatrix a){
	for(int i=0;i<a.num;i++){
		cout<<"row:"<<" "<<a.node[i].line<<" "<<"col"<<" "<<a.node[i].column<<" "
		<<"value"<<" "<<a.node[i].value<<endl; 
	}
}
int main()
{
	trmatrix a,c,d;
	trmatrix *b=&c;
	
	a.linenum=3;a.columnnum=4;
	a.num=12;
	int count=0;
	for(int i=0;i<3;i++)
		for(int j=0;j<4;j++){
			a.node[count].line=i+1;
			a.node[count].column=j+1;
			a.node[count].value=i*4+j+1;
			count++;
		}
		prints(a); 
		cout<<endl;
		
		
		zhuanzhi(a,b);//列序递增转置 
		prints(*b); 
		cout<<endl;
		
		b=&d;
		fasttsmatrix(a,b);//一次快速重定位转置 
		prints(*b);

	
}

运行结果如下

欢迎参考学习 批评指正

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值