三元组矩阵转置

</pre><pre name="code" class="cpp"><span style="font-family: Arial, Helvetica, sans-serif;">#include <stdio.h></span>
#include <stdlib.h>
#define MAXSIZE 100	//非零元的最大个数
#define ElenType int
#define Status int//返回值类型
#define OK 1
#define ERROR 0
#define OVERFLOW -1

/*稀疏矩阵的三元组存储结构*/
typedef struct {
	int row,col;//非零元的行下标和列下标
	ElenType data;//元素的值
}Triple;
typedef struct {
	Triple dataArray[MAXSIZE+1];//非零元组表,dataArray[0]未用
	int row_count,col_count,data_count;//矩阵的行数,列数和非零元个数
}*TSMatrix,Matrix;//代表Triple Sequence Matrix 三元组矩阵

/*创建一个矩阵*/
Status CreateTSMatrix(TSMatrix &M){
	M = (TSMatrix)malloc(sizeof(Matrix));
	if(!M){
		exit(OVERFLOW);
	}
	printf("输入三元组的行数,列数和非零元个数:");
	int rc,cc,dc;
	scanf("%d%d%d",&rc,&cc,&dc);
	M->row_count = rc;
	M->col_count = cc;
	M->data_count = dc;
	int i = 0;
	printf("开始构造矩阵\n");
	int r,c,d;//作为临时变量
	while(i<dc){
		printf("输入第%d个非零元的行号,列号和值:",i+1);
		scanf("%d%d%d",&r,&c,&d);
		if(r>rc || c>cc){	//行和列不能越界
			printf("此组数据不合法,请重新输入\n");
			continue;
		}else{
			//因为下标从1 开始,所以i+1
			M->dataArray[i+1].row = r;
			M->dataArray[i+1].col = c;
			M->dataArray[i+1].data = d;
			i++;//此时才++
		}
	}
	printf("构造矩阵成功\n");
	return OK;
}
/*打印三元组矩阵*/
Status PrintTSMatrix(TSMatrix M){
	//此方法只适合于行列都从小到大排好序的dataArray数组
/*	int rc,cc,dc;
	rc = M->row_count;
	cc = M->col_count;
	int k = 1;
	for(int i = 1;i <= rc;i++){
		for(int j = 1;j <= cc;j++){
			if(i==M->dataArray[k].row && j == M->dataArray[k].col){
					printf("%d  ",M->dataArray[k].data);
					k++;
			}else{
				printf("0  ");
			}
		}
		printf("\n");
	}*/
	//所以还是用描述法吧
	for(int i=1;i<=M->data_count;i++){
		printf("行号 列号 值:%d %d %d",M->dataArray[i].row,M->dataArray[i].col, M->dataArray[i].data);
		printf("\n");
	}
	return OK;
}
/*使用暴力法转置*/
Status BruseTranspose(TSMatrix &M_from,TSMatrix &M_to){
	//分配空间
	M_to = (TSMatrix)malloc(sizeof(Matrix));
	M_to->row_count = M_from->col_count;
	M_to->col_count = M_from->row_count;
	M_to->data_count = M_from->data_count;
	//若有非零元才转置
	if(M_to->data_count	){
		int to_index = 1;//to矩阵的数组游标
		for(int row = 1;row <= M_to->row_count;row++){
			for(int d = 1;d <= M_to->data_count;d++){
				if(M_from->dataArray[d].col == row){
					M_to->dataArray[to_index].row = M_from->dataArray[d].col;
					M_to->dataArray[to_index].col = M_from->dataArray[d].row;
					M_to->dataArray[to_index].data = M_from->dataArray[d].data;
					++to_index;
				}
			}
		}
	}
	return OK;
}
/*
*快速转置法,借助num和cpot两个数组,num[col]表示矩阵M中第col列的非零元个数
*cpot[col]表示第col列的第一个非零元在转置后的矩阵T.dataArray数组中的合适位置
*其中:cpot[1]=1;cpot[col] = cpot[col-1]+num[col-1];
*/
Status FastTranspose(TSMatrix M,TSMatrix &T){
	T->col_count = M->row_count;
	T->row_count = M->col_count;
	T->data_count = M->data_count;
	int col,*num,*cpot;
	num = cpot = (int*)malloc(sizeof(int)*M->col_count);
	if(!num){
		exit(OVERFLOW);
	}
	if(T->data_count){
		for(col=1;col<=T->col_count;col++){//初始化为0
			num[col] = 0;
		}
		for(int i=1;i<M->data_count;i++){
			++num[M->dataArray[i].col];//遍历非零元,求得每一列非零元个数
		}
		cpot[1] = 0;
		for(col=2;col<=M->col_count;col++){
			cpot[col] = cpot[col-1]+num[col-1];
		}
		int t;
		for(int p=1;p<=M->data_count;p++){
			col = M->dataArray[p].col;//取出这一个非零元的列数
			t = cpot[col];//找到此非零元在T.dataArray的位置
			//交换赋值
			T->dataArray[t].row = M->dataArray[p].col;
			T->dataArray[t].col = M->dataArray[p].row;
			T->dataArray[t].data = M->dataArray[p].data;
			++cpot[col];//将位置往后挪,因为同一列的元素可能不止一个
		}
	}
	return OK;
}

int main(){
	TSMatrix M;
	CreateTSMatrix(M);
	printf("原始矩阵:\n");
	PrintTSMatrix(M);
	TSMatrix T;
	BruseTranspose(M,T);
	printf("暴力法转置:\n");
	PrintTSMatrix(T);
	FastTranspose(M,T);
	printf("快速转置:\n");
	PrintTSMatrix(T);
	return 0;
}

运行结果:



  • 7
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值