数据结构——基于C语言,稀疏矩阵的转置

【数据结构】:

typedef int ElementType;
typedef struct{
	int row,col;   //行和列 
	ElementType e;   //非零元素的值 
}Triple; 

typedef struct{
	Triple data[MAXSIZE+1]; //非零元素的三元组表。 
	int m,n,len;     //矩阵的行数,列数和非零元素的个数 
}TSMatrix;

【算法思想】:
(一)首先我编写了一个二维数组,用来容纳稀疏矩阵。
(二)然后再把稀疏矩阵的非零元素添加到三元组中。
(三)最后我们在把三元组的元素转置到新的三元组中。 这个过程中使用了一次性定位快速转置法,具体算法思想如下:
一次性定位快速转置法可以通过一重循环来完成,可以使原三元组的非零元一次性定位放到新三元组表中正确的位置。
使用这个方法前,首先我们要先计算以下数据: 在下面的代码中,我们使用了num[col]和position[col]两个数组。
粗略来说。 num用来存放原表第col列中非零元素总个数。
Position:第col列中第一个非零元素在新三元组表中的存储位置。(下标值)

【算法描述】:
//将矩阵的数据转置到三元组表中。

int zipMatrix(int arr[jie][jie],Triple *t,TSMatrix &tm){
	    tm.len=1;
	 for(tm.m=0;tm.m<jie;tm.m++){
	 	for(tm.n=0;tm.n<jie;tm.n++){
	 		if(arr[tm.m][tm.n]!=0){		
	 			t->row=tm.m+1;
	 			t->col=tm.n+1;
				t->e=arr[tm.m][tm.n]; 
	 			tm.data[tm.len].row=tm.m+1;
	 			tm.data[tm.len].col=tm.n+1;
	 			tm.data[tm.len].e=arr[tm.m][tm.n]; 
	 			tm.len++;
	 			t++;
			 }		  
		 }
	 }
	 tm.m+=1;
	 tm.n+=1;
	return tm.len; 
} 

//一次定位快速转置算法

TSMatrix FastTransposeTSMatrix(TSMatrix A,TSMatrix B,int len){
	int col,t,p,q,k;
	int num[MAXSIZE],position[MAXSIZE];
	B.len=A.len;B.n=A.m;B.m=A.n;
	if(B.len){
	//每次循环前,先把内容置零 
	for(col=1;col<=A.n;col++)
	num[col]=0;
	//采用数组下标计数法计算每一列的非零元素个数。 
	for(t=1;t<A.len;t++){
		num[A.data[t].col]++;
}
		position[1]=1;   //第一列的位置转置后为1
		//求出col列中第一个非零元素在B.data[]中的正确位置 
	for(col=2;col<=A.len;col++){
		position[col]=position[col-1]+num[col-1];
}
	//将被转置矩阵的三元组表A从头至尾扫描一次,实现矩阵转置
	for(p=1;p<=A.len;p++){
		col=A.data[p].col;
		q=position[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;
		position[col]++;   //加一,使之指向下一个列号为col的非零元素在三元组表B中存放的位置。 
	}	 
}
	printf("\n");
	return B;	
} 
//遍历数据
void cha(TSMatrix tm,int len){
	for(int k=1;k<len;k++){
//	printf("(%d,",t[k].row);
//	printf("%d,",t[k].col);
//	printf("%d)",t[k].e);
	printf("(%d,",tm.data[k].row);	
	printf("%d,",tm.data[k].col);	
	printf("%d)",tm.data[k].e);	
	} 
	printf("\n");
} 
//最后只要在主函数调用即可
int main(){
	//首先,我需要先定义一个稀疏矩阵
	 int arr[jie][jie]={
	 	{0,3,0,7,0,9},
        {7,3,8,0,0,0},
		{0,4,0,8,0,0},
        {6,0,0,5,0,1},
		{0,0,3,0,1,0},
        {3,0,0,0,7,0}
    };
	 
	//初始化三元组
	Triple t[MAXSIZE]={};
	Triple *T=t;
	TSMatrix tm; 
	TSMatrix ztm; 
	//把二维稀疏矩阵的数据添加到三元组中 
	int len = zipMatrix(arr,T,tm);
	printf("三元组转置前:\n"); 
	//查询输出数据 
    cha(tm,len);
	printf("\n");	
	//新建了一个三元组表,调用转置的方法 
	ztm = FastTransposeTSMatrix(tm,ztm,len);	//这里建议用指针  
	printf("三元组转置后:\n"); 
	//查询输出数据 
	cha(ztm,len);
	return 0;
} 

最后运行的示意图:
在这里插入图片描述
源码下载:

https://download.csdn.net/download/weixin_42868605/21006242

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

掉色的熊猫

大爷,赏点吧。

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

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

打赏作者

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

抵扣说明:

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

余额充值