ADT稀疏矩阵的两种转置方式

/***************ADT稀疏矩阵*******************
 **************BY:loseryao*********************
 ***************2015-6-11*********************/
#include <iostream>
#define MAX_TREMS 101 //定义矩阵最大值
#define MAX_COL 50//定义最大列值
using namespace std;
/***************定义矩阵*******************************/
typedef struct 
{
	int row;
	int col;
	int value;
} term;
term  a[MAX_TREMS];

/*********矩阵转置***********************************/
void transpose(term a[] , term b[])
{
	int n,i,j ,currentb = 1;
	n = a[0].value;  //元素总数
	b[0].row = a[0].col;
	b[0].col = a[0].row;
	b[0].value = n;	
	if(n > 0)
	{
		for(i = 0; i <a[0].col ;i++)//从a的列转置
		{
			for(j = 1;j <=n; j++)//扫描a的每一项
			{
				if(a[j].col == i)
				{
					b[currentb].col = a[j].row;
					b[currentb].row = a[j].col;
					b[currentb].value = a[j].value;
					currentb++;
				}

			}
		}
	}
}
/************************输出矩阵**************************************/
void printMaxtrix(term a[])
{
	for(int i = 0; i < a[0].value;i++)
	{
		cout<<"col = "<<a[i].col<<"  row = "<<a[i].row<<" value = "<<a[i].value<<endl;
	}

}
	

/*********************矩阵快速转置************************************/
void fast_transpose(term a[],term b[])
{
	int row_item[MAX_COL],start_position[MAX_COL],j=0;
	b[0].col = a[0].row;
	b[0].row = a[0].col;
	b[0].value = a[0].value;
	for(int i = 0;i < a[0].col ; i++)
		row_item[i] =  0;
	for(int i = 1; i <=a[0].value;i++)
		row_item[a[i].col]++;	
	start_position[0] = 1;
	for(int i = 1;i < a[0].col;i++)
      start_position[i] = start_position[i-1] + row_item[i -1];//当前行的位置是上一行位置加该行个数
	for(int i = 1;i <= a[0].value;i++)
	{
		j = start_position[ a[i].col]++;//如果是重复列可以前进一位
		b[j].row = a[i].col;
		b[j].col = a[i].row;
		b[j].value = a[i].value;
	}
	

}
int main()
{
	term a[9],b[9],c[9];
	a[0].row = 6;
	a[0].col = 6;
	a[0].value = 8;
	a[1].col = 0;
	a[1].row = 0;
	a[1].value =15;
	a[2].row =0;
	a[2].col = 3;
	a[2].value  =22;
	a[3].row = 0;
	a[3].col = 5;
	a[3].value = -15;
	a[4].row = 1;
	a[4].col = 1;
	a[4].value = 3;
	a[5].row = 1;
	a[5].col = 2;
	a[5].value = 3;
	a[6].row = 2;
	a[6].col = 3;
	a[6].value = -6;
	a[7].row  = 4;
	a[7].col = 0;
	a[7].value = 91;
	a[8].row= 5;
	a[8].col = 2;
	a[8].value = 28;
	cout<<"Before transpose"<<endl;
	printMaxtrix(a);
	//transpose(a,b);
	//cout<<"After transpose"<<endl;
	//printMaxtrix(b);
	cout<<"After transpose"<<endl;
	fast_transpose(a,c);
	printMaxtrix(c);
	return 0;


}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值